1. ホーム
  2. matlab

[解決済み] matlab のプロットベクトルは同じ長さでなければなりません。

2022-02-17 20:28:05

質問

以下の境界値問題を解くプログラムを書いています。 シューティングバイセクション法 :

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は私がplot引数を間違って使っていると言いました、plotベクトルは同じ長さでなければなりません。この問題をどのように修正したらよいのか全くわかりません。どんな助けでも感謝します。

どのように解決するのですか?

あなたの Y , ZW の出力は、異なるランから ode113 . 出力された無党派層の変数 G が異なるため、それぞれのランから ode113 は適応型ソルバーです。これを解決する方法は2つあります。まず G を別の変数として出力します。

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

または、固定された出力点のセットを指定することもできます。 に2点以上指定することで tspan (の第2引数)。 ode113 ):

...
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年以上前のものでない限り、積分関数も指定する必要があります。 shoot を経由して 関数ハンドル を、文字列ではなく、すなわち

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