2017-01-13 9 views
1

でなければならない私は、撮影-二分法を使用して、次の境界値問題の解決に関するプログラムを書いています:MathWorks社のMATLABプロットのベクトルが同じ長さ

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

私は最初の一次方程式のシステムにこれを変換し、

y'=z 

を設定し、その後、私はdydtはベクトル(Y 'Z')を表し、およびスクリプトファイルを思い付くしてみましょう:

function dydt=shoot(t,y) 
dydt=[y(2);y(1)-t] 
end 
これにより

、私は次のコードを思い付いた:その後、私はプログラムを実行

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') 

、MATLABは、プロットのベクトルが同じ長さでなければならないところ、私は、間違ってプロット引数を使用していました。私はこの問題をどのように修正するのか分かりません。どんな助けもありがとうございます。

+1

'G 'のサイズは何ですか?' Y(:、1) 'のサイズは何ですか?彼らは同じサイズである必要があります。 – Suever

+0

セカントメソッド(または括弧で囲まれたバリアントにregula falsiメソッド)を使用する場合、繰り返しは1ステップで終了します。問題は線形であるため、第2の境界値は第1の境界値に線形に依存し、その線形関数は2つの点で決定することができる。 – LutzL

+0

@LutzL私は2回の射撃の後に二分法を使用していると思う。この場合、ループが1ステップ後に終了することを意味しますか? –

答えて

2

Y,ZおよびWの出力は、異なる実行ode113からのものです。 ode113は適応ソルバであるため、各実行からの出力独立変数Gは異なります。これを解決するには2つの方法があります。

... 
[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'); 

それとも、(ode113に第二引数)出力点by specifying more than two points for tspanの固定セットを指定することができます:あなたは別の変数としてごG出力を保存することができます

... 
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'); 

のMatlabのバージョンはより多くのでない限り10年前には、という積分関数を文字列ではなくfunction handleで指定する必要があります。

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

それはとてもうまく動作します。ありがとう! –

関連する問題