Bistable
Z Skrypty dla studentów Ekonofizyki UPGOW
(Różnice między wersjami)
(Utworzył nową stronę „===Obligacja ze stałym kuponem=== Mamy obligację, której emitent zobowiązuje się do płacenia odsetek regularnie raz do roku i zamierza zwrócić zaciągnięte …”) |
m |
||
(Nie pokazano 19 wersji pomiędzy niniejszymi.) | |||
Linia 1: | Linia 1: | ||
- | === | + | ==Oscylator bistabliny== |
- | + | ||
- | |||
- | |||
- | + | ===Układ === | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | Rozważmy oscylator nieliniowy (usaa): | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | <math>m \ddot x = -\frac{dU(x)}{dx}-\gamma x ,</math> | |
- | < | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | + | równoważnie: | |
- | + | <math>\dot x = v</math> | |
- | < | + | |
- | + | ||
- | + | ||
- | + | <math>m \dot v = -\frac{dU(x)}{dx}-\gamma x ,</math> | |
- | + | jako potencjal weżmy funkcję z dwoma minimami np.: | |
- | + | ||
- | + | <math>U(x) = \displaystyle x^4-4 x^2,</math> | |
+ | |||
+ | Wykres U(x) można otrzymać poleceniem: | ||
+ | <source lang="matlab"> | ||
+ | fplot(@(x) x.^4-4*x.^2,[-2.1,2.1],200) | ||
</source> | </source> | ||
+ | <math>f(x) =-\frac{dU(x)}{dx} = -4 x^3+8 x^2,</math> | ||
+ | <source lang="matlab"> | ||
+ | close all | ||
+ | clear all | ||
+ | f =@(x,E) sqrt(8*x.^2-2*x.^4-E); | ||
+ | xa=linspace(-2,2,200); | ||
+ | xb=linspace(2,-2,200); | ||
+ | hold on | ||
+ | for E=-8:2:8 | ||
+ | Rts=roots([-2,0,8,0,-E]); | ||
+ | AllRealRoots=sort(Rts(find (imag(Rts)==0))); | ||
+ | if (length(AllRealRoots)==2) | ||
+ | xminmax=sort([AllRealRoots',-0.00001,0.00001]); | ||
+ | else | ||
+ | xminmax=AllRealRoots'; | ||
+ | endif | ||
+ | xa=linspace(xminmax(1),xminmax(2),200); | ||
+ | xb=linspace(xminmax(3),xminmax(4),200); | ||
- | + | if (E==0) | |
+ | plot([rotdim(xa,2),xa],[-f(rotdim(xa,2),E),f(xa,E)],"r-;E=0;"); | ||
+ | plot([xb,rotdim(xb,2)],[f(xb,E),-f(rotdim(xb,2),E)],"r-"); | ||
+ | else | ||
+ | plot([rotdim(xa,2),xa],[-f(rotdim(xa,2),E),f(xa,E)],"g-"); | ||
+ | plot([xb,rotdim(xb,2)],[f(xb,E),-f(rotdim(xb,2),E)],"g-"); | ||
+ | endif | ||
+ | endfor | ||
+ | hold off | ||
+ | </source> | ||
+ | ===Analiza=== | ||
<source lang="matlab"> | <source lang="matlab"> | ||
- | + | lsode_options("absolute tolerance",1e-6) | |
- | + | lsode_options("relative tolerance",1e-6) | |
- | + | n=500; | |
- | + | tmax=10; | |
- | + | t = linspace(0,tmax,n); | |
- | + | global gama; | |
+ | gama=0.9 | ||
+ | ny=10; | ||
+ | y=linspace(0,5,ny); | ||
+ | x0=-sqrt(2); | ||
+ | trajsxP=zeros(ny,n); | ||
+ | trajsyP=zeros(ny,n); | ||
+ | trajsxN=zeros(ny,n); | ||
+ | trajsyN=zeros(ny,n); | ||
+ | for iy=1:ny | ||
+ | X0 = [x0,y(iy)]; | ||
+ | [X,T,MSG]=lsode(@ODEbistable,X0,t); | ||
+ | if(X(length(X),1)>0) | ||
+ | trajsxP(iy,:)=X(:,1); | ||
+ | trajsyP(iy,:)=X(:,2); | ||
+ | else | ||
+ | trajsxN(iy,:)=X(:,1); | ||
+ | trajsyN(iy,:)=X(:,2); | ||
+ | endif | ||
+ | endfor | ||
+ | disp("Integration done"); | ||
+ | hold on | ||
+ | every=20 | ||
+ | for i=(every+1):every:size(trajsxP)(2) | ||
+ | plot(trajsxP(:,(i-every):i)',trajsyP(:,(i-every):i)',"r-",\ | ||
+ | trajsxN(:,(i-every):i)',trajsyN(:,(i-every):i)',"b-") | ||
+ | drawnow() | ||
+ | disp(t(i)); | ||
+ | fflush(stdout); | ||
+ | print ( sprintf("Traj_anim_%05d.png",i), "-S300,220"); | ||
+ | endfor | ||
+ | hold off | ||
</source> | </source> | ||
- | + | który możemy zaimplementować jako funkcję w matlabie: | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | |||
<source lang="matlab"> | <source lang="matlab"> | ||
- | function | + | function dx = ODEbistable(X,T) |
- | + | global gama; | |
- | + | dx = zeros(2,1); | |
- | + | dx(1) = X(2); | |
+ | dx(2) = -gama*X(2)-4*X(1).^3+8*X(1); | ||
+ | return | ||
+ | end | ||
</source> | </source> | ||
- | [[Plik: | + | [[Plik:bistable_anim.gif|thumb|216px|Trajektorie w nieliniowym oscylatorze.]] |
+ | [[Plik:bistable_color.png|thumb|360px|Baseny przyciągania w nieliniowym oscylatorze.]] |
Aktualna wersja na dzień 09:00, 8 lis 2010
Oscylator bistabliny
Układ
Rozważmy oscylator nieliniowy (usaa):
\(m \ddot x = -\frac{dU(x)}{dx}-\gamma x ,\)
równoważnie:
\(\dot x = v\)
\(m \dot v = -\frac{dU(x)}{dx}-\gamma x ,\)
jako potencjal weżmy funkcję z dwoma minimami np.:
\(U(x) = \displaystyle x^4-4 x^2,\)
Wykres U(x) można otrzymać poleceniem:
fplot(@(x) x.^4-4*x.^2,[-2.1,2.1],200)
\(f(x) =-\frac{dU(x)}{dx} = -4 x^3+8 x^2,\)
close all clear all f =@(x,E) sqrt(8*x.^2-2*x.^4-E); xa=linspace(-2,2,200); xb=linspace(2,-2,200); hold on for E=-8:2:8 Rts=roots([-2,0,8,0,-E]); AllRealRoots=sort(Rts(find (imag(Rts)==0))); if (length(AllRealRoots)==2) xminmax=sort([AllRealRoots',-0.00001,0.00001]); else xminmax=AllRealRoots'; endif xa=linspace(xminmax(1),xminmax(2),200); xb=linspace(xminmax(3),xminmax(4),200); if (E==0) plot([rotdim(xa,2),xa],[-f(rotdim(xa,2),E),f(xa,E)],"r-;E=0;"); plot([xb,rotdim(xb,2)],[f(xb,E),-f(rotdim(xb,2),E)],"r-"); else plot([rotdim(xa,2),xa],[-f(rotdim(xa,2),E),f(xa,E)],"g-"); plot([xb,rotdim(xb,2)],[f(xb,E),-f(rotdim(xb,2),E)],"g-"); endif endfor hold off
Analiza
lsode_options("absolute tolerance",1e-6) lsode_options("relative tolerance",1e-6) n=500; tmax=10; t = linspace(0,tmax,n); global gama; gama=0.9 ny=10; y=linspace(0,5,ny); x0=-sqrt(2); trajsxP=zeros(ny,n); trajsyP=zeros(ny,n); trajsxN=zeros(ny,n); trajsyN=zeros(ny,n); for iy=1:ny X0 = [x0,y(iy)]; [X,T,MSG]=lsode(@ODEbistable,X0,t); if(X(length(X),1)>0) trajsxP(iy,:)=X(:,1); trajsyP(iy,:)=X(:,2); else trajsxN(iy,:)=X(:,1); trajsyN(iy,:)=X(:,2); endif endfor disp("Integration done"); hold on every=20 for i=(every+1):every:size(trajsxP)(2) plot(trajsxP(:,(i-every):i)',trajsyP(:,(i-every):i)',"r-",\ trajsxN(:,(i-every):i)',trajsyN(:,(i-every):i)',"b-") drawnow() disp(t(i)); fflush(stdout); print ( sprintf("Traj_anim_%05d.png",i), "-S300,220"); endfor hold off
który możemy zaimplementować jako funkcję w matlabie:
function dx = ODEbistable(X,T) global gama; dx = zeros(2,1); dx(1) = X(2); dx(2) = -gama*X(2)-4*X(1).^3+8*X(1); return end