如何在matlab中求解具有某些终端条件的常微分方程组?

如何在matlab中求解具有某些终端条件的常微分方程组?,matlab,ode,differential-equations,boundary,Matlab,Ode,Differential Equations,Boundary,我有14个一阶微分方程。 14个条件,7个是初始条件,如x1(0)=0,x2(0)=5。。。 7是终端设备x8(10)=25,x9(10)=0 我想我应该使用bvp4c 我找到了这个答案,但我仍然有几个问题: 我创建了一个matlab函数,将我的系统放入其中 x'=2x y'=3x+5y 将其编码为: xdot=[2x(1);3x(1)+5x(2)] 就像我在ode45中所做的那样。 那么我应该对边界条件做同样的处理。但我不知道如何编写它们。 我应该构建一个包含它们的矩阵,但我

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

我想我应该使用
bvp4c

我找到了这个答案,但我仍然有几个问题:

我创建了一个matlab函数,将我的系统放入其中

   x'=2x
   y'=3x+5y
将其编码为:

 xdot=[2x(1);3x(1)+5x(2)]
就像我在
ode45中所做的那样。
那么我应该对边界条件做同样的处理。但我不知道如何编写它们。
我应该构建一个包含它们的矩阵,但我不知道如何构建它

我试着使用这个参考:第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))));

要使用syms求解BVP ode,ode为
y'+3y'+3y=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;


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

我的14个方程非常庞大,我担心我需要数值方法。我正在使用你发布的示例。我不知道你有什么。但是你先在dsolve上试过吗?你说它们是一等的颂歌。我相信dsolve可以解决一阶ode。如果你能看看系统的大小,并给我一个关于我应该寻找哪种解决方案的意见,我将不胜感激。我尝试去除u1和u2上的边界,但matlab没有找到明确的解决方案。我将使用bvp4c,您能用bvp4c语法和time=1的一个条件重写您的第一个示例吗?谢谢你的建议。现在我的问题似乎解决了,如果你不介意的话,再问一个问题就行了。在plot(sol.x(1,:),-sol.y(1,:),'r')中,为什么会有“-?”?如果系统只是一阶的,并且您具有初始条件并需要数值解,则可以使用ode45。如果您有边界条件,并且想要数值解,请使用bvp4c,因为ode45仅适用于初始条件。你可以看一看例子。由于dsolve是象征性的,所以它不关心条件是初始条件还是其他条件。例如,在下面的解决方案中,将y(0)==1更改为y(1)==1,它将解决该问题。我正在尝试dsolve,但在添加关于u1和u2的行时,我遇到了一个错误。它说它们必须是可转换的浮点数。这有点奇怪,不是也需要符号表达吗?我同意这可能是你最好的答案。如果dsolve能解析地解出一个14维系统,其中嵌套着像max(min())这样令人讨厌的非线性,我会感到震惊there@alexandreiolov谢谢,我正在尝试bvp4c atm,我在输入边界条件时遇到了一些问题,但这段视频有助于: