2017-01-13 4 views
1

Ich schreibe ein Programm in Bezug auf die folgende Randwertproblem zu lösen mit Schieß Bisektionsmethode:Matlab Plot Vektoren müssen die gleiche Länge haben

y''-y+x=0, y(0)=y(1)=0. 

ich wandeln diese erste auf ein System erster Ordnung Gleichungen, set

y'=z 

stellen dann lasse ich dydt den Vektor (y 'z'), und kommen mit der Skriptdatei:

function dydt=shoot(t,y) 
dydt=[y(2);y(1)-t] 
end 

Damit ich mit dem folgenden Code dann kommt:

clear 
clc 
a=0; 
b=1; 
alpha=0; 
beta=0; 
s(1)=(beta-alpha)/(b-a); 
s(2)=-1 
[G,Y]=ode113('shoot',[a b],[alpha;s(1)]); 
[G,Z]=ode113('shoot',[a b],[alpha;s(2)]) 
hold 
tol=1e-4 
u=s(1); 
v=s(2); 
while abs(u-v)>tol; 
s(3)=(u+v)/2; 
[G,W]=ode113('shoot',[a b],[alpha;s(3)]); 
if W(end,1)>0 
    u=s(3); 
else 
    v=s(3); 
end 
end 

[G,W]=ode113('shoot',[a b],[alpha;s(3)]) 

plot(G,Y(:,1),'-o', G,Z(:,1),'-o',G,W(:,1),'-o') 

Dann laufe ich das Programm, sagte MATLAB ich die Handlung Argument falsch bin mit, wo Plot Vektoren die gleichen Längen aufweisen müssen. Ich habe keine Ahnung, wie ich dieses Problem beheben kann. Jede Hilfe wird geschätzt.

+1

Wie groß ist 'G' und wie groß ist' Y (:, 1) '? Sie müssen die gleiche Größe haben. – Suever

+0

Ihre Iteration würde in einem Schritt enden, wenn Sie die Sekantenmethode (oder die Regula-Falsi-Methode für eine Klammervariante) verwenden würden. Das Problem ist linear, daher hängt der zweite Grenzwert linear von dem ersten ab, und diese lineare Funktion kann durch zwei Punkte bestimmt werden. – LutzL

+0

@LutzL Ich glaube ich benutze die Halbierung nach zwei Schießereien. Meinst du meine Schleife endet nach einem Schritt in diesem Fall? –

Antwort

2

Ihre Y, Z und W Ausgänge stammen aus verschiedenen Ausführungen von ode113. Die Ausgabe-unabhängigen Variablen G aus jedem Lauf sind unterschiedlich, da ein adaptiver Solver ist. Es gibt zwei Möglichkeiten, wie Sie das beheben können.

... 
[Gy,Y]=ode113('shoot',[a b],[alpha;s(1)]); 
[Gz,Z]=ode113('shoot',[a b],[alpha;s(2)]); 
... 
[Gw,W]=ode113('shoot',[a b],[alpha;s(3)]); 
plot(Gy,Y(:,1),'-o', Gz,Z(:,1),'-o',Gw,W(:,1),'-o'); 

Oder Sie könnten einen festen Satz von Ausgangspunkten by specifying more than two points for tspan (zweites Argument ode113) angeben: Sie können Ihre G Ausgänge als separate Variablen speichern

... 
tspan = linspace(a,b,50); 
[G,Y]=ode113('shoot',tspan,[alpha;s(1)]); 
[G,Z]=ode113('shoot',tspan,[alpha;s(2)]); 
... 
[G,W]=ode113('shoot',tspan,[alpha;s(3)]); 
plot(G,Y(:,1),'-o', G,Z(:,1),'-o',G,W(:,1),'-o'); 

Es sei denn, Ihre Version von Matlab ist mehr als 10 Jahre alt, sollten Sie auch Ihre Integrationsfunktion angeben, shoot über eine function handle, nicht eine Zeichenfolge, das heißt:

[Gw,W]=ode113(@shoot,[a b],[alpha;s(3)]); 
+0

Das funktioniert sehr gut. Vielen Dank! –

Verwandte Themen