【问题标题】:matlab plot vectors must be the same lengthsmatlab绘图向量必须是相同的长度
【发布时间】:2017-01-13 21:31:45
【问题描述】:

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

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 向量必须是相同的长度。我不知道如何解决这个问题。任何帮助表示赞赏。

【问题讨论】:

  • G 的大小是多少,Y(:,1) 的大小是多少?它们的大小必须相同。
  • 如果您使用割线法(或括号变体的 regula falsi 法),您的迭代将在一步中终止。问题是线性的,因此第二个边界值线性依赖于第一个边界值,并且该线性函数可以由两个点确定。
  • @LutzL 我想我在两次拍摄后使用了二等分法。你的意思是在这种情况下我的循环在一步后终止?
  • 如果您使用以[0,1] 开头的二分法求解0=f(x)=3x-1,您将无限迭代(直到达到停止标准),因为精确解是无限二进制分数。使用割线法,您可以一步找到解决方案。这种情况类似。

标签: matlab differential-equations


【解决方案1】:

您的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)]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多