【问题标题】:how can I solve a system of ODEs with some terminal conditions in matlab?如何在 matlab 中解决具有某些终端条件的 ODE 系统?
【发布时间】:2015-05-23 14:25:18
【问题描述】:

我有 14 个一阶微分方程。 14 个条件,7 个是初始条件,例如 x1(0)=0x2(0)=5... 7 是终端的x8(10)=25,x9(10)=0....

我想我应该使用bvp4c

我找到了这个答案,但我还有几个问题:how to solve a system of Ordinary Differential Equations (ODE's) in Matlab

我创建了一个 matlab 函数来放入我的系统。

   x'=2x
   y'=3x+5y

编码如下:

 xdot=[2x(1);3x(1)+5x(2)]

就像我在ode45 中所做的那样。 然后我应该对边界条件做同样的事情。但我不知道如何编码它们。 我应该构建一个包含它们的矩阵,但我不知道如何构建它。

我正在尝试使用此参考:http://www.math.tamu.edu/~phoward/m442/matode.pdf 第 12 页,但他做了y2=y' 的事情,我有点迷失在我的案例中。它也没有很好地解释我应该如何放置我拥有的 14 个条件。一条7条,另一条7条?如何告诉程序每个变量引用了哪个值?

提前致谢。

这是实际系统。它有点大,所以我担心我需要数值方法。

f1=(delta1*gn-(beta*phi*x(7)*x(1)+(1-u1))/(x(1)+x(2)+x(3)+x(4))-mu*x(1)+psi*x(4));
f2=((beta*phi*x(7)*x(1)*(1-u1))/(x(1)+x(2)+x(3)+x(4))-d*x(2)-mu*x(2));
f3=(d*x(2)-(r+r0*u2)*x(3)-(alfa+mu)*x(3));
f4=((r+r0*u2)*x(3)-(mu+phi)*x(4));
f5=(delta2*hp-(phi*teta*x(3)*x(5)*(1-u1))/(x(1)+x(2)+x(3)+x(4))-gamma*x(5));
f6=((phi*teta*x(3)*x(5)*(1-u1))/(x(1)+x(2)+x(3)+x(4))-gamma*x(6)-k*x(6));
f7=(k*x(6)-gamma*x(7));
f8=x(8)*(mu - (beta*phi*x(1)*x(7) - u1 + 1)/(x(1) + x(2) + x(3) + x(4))^2 + (beta*phi*x(7))/(x(1) + x(2) + x(3) + x(4))) + x(9)*((beta*phi*x(7)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4)) - (beta*phi*x(1)*x(7)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2) + (teta*x(12)*phi*x(3)*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2 - (teta*x(13)*phi*x(3)*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2;
f9=x(9)*(d + mu - (beta*phi*x(1)*x(7)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2) - d*x(10) - A1 - (x(8)*(beta*phi*x(1)*x(7) - u1 + 1))/(x(1) + x(2) + x(3) + x(4))^2 + (teta*x(12)*phi*x(3)*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2 - (teta*x(13)*phi*x(3)*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2;
f10= x(10)*(alfa + mu + r + r0*u2) - A2 - x(11)*(r + r0*u2) - x(12)*((teta*phi*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4)) - (teta*phi*x(3)*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2) + x(13)*((teta*phi*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4)) - (teta*phi*x(3)*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2) - (x(8)*(beta*phi*x(1)*x(7) - u1 + 1))/(x(1) + x(2) + x(3) + x(4))^2 - (beta*x(9)*phi*x(1)*x(7)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2;
f11=x(11)*(mu + phi) - x(8)*(psi + (beta*phi*x(1)*x(7) - u1 + 1)/(x(1) + x(2) + x(3) + x(4))^2) - (beta*x(9)*phi*x(1)*x(7)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2 + (teta*x(12)*phi*x(3)*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2 - (teta*x(13)*phi*x(3)*x(5)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))^2;
f12=x(12)*(gamma - (teta*phi*x(3)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4))) + (teta*x(13)*phi*x(3)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4));
f13=x(13)*(gamma + k) - k*x(14);
f14=gamma*x(14) + (beta*x(8)*phi*x(1))/(x(1) + x(2) + x(3) + x(4)) + (beta*x(9)*phi*x(1)*(u1 - 1))/(x(1) + x(2) + x(3) + x(4));

额外的:

u1=max(a1,min(b1,1/(2*B1)*(beta*phi/(x(1)+x(2)+x(3)+x(4))*x(7)*x(1)*(x(9)-x(8))+phi*teta/(x(1)+x(2)+x(3)+x(4))*x(3)*x(5)*(x(13)-x(12)))));
u2=max(a2,min(b2,1/(2*B2)*(r0*x(3)*x(10)-r0*x(3)*x(11))));

【问题讨论】:

  • 如果你的系统只是一阶系统,并且你有初始条件并且想要数值解,你可以使用ode45。如果您有边界条件并想要数值解,请使用 bvp4c,因为 ode45 仅适用于初始条件。您可以查看mathworks.com/help/matlab/ref/bvp4c.html 的示例。 dsolve,因为它是象征性的,不关心条件是初始的还是其他的。例如,在下面的解决方案中,将 y(0)==1 更改为 y(1)==1 即可解决。
  • 我正在尝试 dsolve,但是当我添加有关 u1 和 u2 的行时出现错误。它说它们需要可转换为浮点数。有点奇怪,不也是象征性的表达吗?
  • 我同意se.mathworks.com/help/matlab/ref/bvp4c.html 可能是你最好的,如果 dsolve 可以解析求解一个 14 维系统,其中嵌套了像 max(min()) 这样令人讨厌的非线性系统,我会感到震惊
  • @alexandreiolov 谢谢,我正在尝试 bvp4c atm,我在输入边界条件时遇到了一些问题,但这个视频很有帮助:youtube.com/watch?v=iEep1-WnjlM

标签: matlab ode differential-equations boundary


【解决方案1】:

使用syms求解BVP ode,ode为y''+3 y' + 3 y = 0,先转换为2一阶(状态空间公式)再求解

clear all; close all
syms x(t) y(t)
Dx  = diff(x);
Dy  = diff(y);
eq1 = Dx == y;
eq2 = Dy == -3*x-5*y;
[x,y] = dsolve(eq1,eq2, x(0) == 0, y(1) ==1)
figure;
ezplot(x,[0,6])

使用 bvp4c 解决相同的 BVP

clear all
t0 = 0; %initial time
tf = 6; %final time
odefun=@(t,y) [y(2); -3*y(1)-5*y(2)];
bcfun=@(yleft,yright) [yleft(1);yright(1)-1];  
solinit = bvpinit(linspace(t0,tf),[0 1]);

sol = bvp4c(odefun,bcfun,solinit);

figure;
plot(sol.x(1,:),-sol.y(1,:),'r')
title('solution');
xlabel('time');
ylabel('y(t)');
grid;

ps。数值解 y 轴值刻度似乎与符号不匹配。但看起来这只是价值的缩放。没时间研究它。可能有人可以发现一些东西,我会更新。

【讨论】:

  • 我的 14 个方程非常庞大,我担心我需要数值方法。
  • 我正在使用您发布的示例。我不知道你有什么。但是您是否先在 dsolve 上尝试过它们?你说他们是一阶颂歌。我确信 dsolve 可以解决一阶颂歌。
  • 如果您能看看系统的大小,并就我应该寻找哪种解决方案给我意见,我将不胜感激。
  • 我尝试删除 u1 和 u2 的边界,但 matlab 没有找到明确的解决方案。我将使用 bvp4c,您能否使用 bvp4c 语法和一个 time=1 条件重写您的第一个示例?感谢您的建议。
  • 它现在似乎可以解决我的问题,如果您不介意,再问一个问题。在 plot(sol.x(1,:),-sol.y(1,:),'r') 为什么会有 ''-''?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
相关资源
最近更新 更多