我正在编写一个程序,使用射击二分法解决以下边界值问题:
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说我正在使用绘图参数不正确,其中绘图向量必须是相同的长度。我不知道如何解决这个问题。任何帮助表示赞赏。
答案 0 :(得分:2)
您的Y
,Z
和W
输出来自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 tspan
(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年,否则您还应通过function handle指定集成函数shoot
,而不是字符串,即:
[Gw,W]=ode113(@shoot,[a b],[alpha;s(3)]);