matlab绘图向量必须是相同的长度

时间:2017-01-13 21:31:45

标签: matlab differential-equations

我正在编写一个程序,使用射击二分法解决以下边界值问题:

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 个答案:

答案 0 :(得分:2)

您的YZW输出来自ode113的不同运行。每次运行的输出独立变量G是不同的,因为ode113是自适应求解器。有两种方法可以解决这个问题。您可以将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');

或者您可以指定一组固定的输出点by specifying more than two points for tspanode113的第二个参数):

...
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指定集成函数shoot,而不是字符串,即:

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