带有符号矩阵输入的ODE

12次浏览(最近30天)
Gabriele加利
Gabriele加利 8月8日
你好所有的,
我使用syms变量写了下面的函数,它的输出(即Sxd)是一个包含12个方程的系统,包含在一个符号矩阵中。
函数Sxd = S1 (t, X)
信谊x1 x2 x3 x4 x5 x6 x7 x8 x9 x11 x12 x1d x2d x3d x4d x5d x6d x7d x8d x9d x10d x11d x12d x1d x2d k1 k2 k3 k4 V0 u dfdx dfdth Sx Sxd
x1 = X (1);
x2 = X (2);
x3 = X (3);
x4 = X (4);
x5 = X (5);
x6 = X (6);
x7 = X (7);
×8 = X (8);
x9 = X (9);
x10 = X (10);
x11 = X (11);
x12 = X (12);
x1d x2 = k1 *;
x2d = (u-x2) / (k2 + k3 * x1);
Dfdx =[diff(x1d, x1) diff(x1d, x2)];Diff (x2d, x1);
dfdth=[diff(x1d, k1) diff(x1d, k2) diff(x1d, k3) diff(x1d, k4) diff(x1d, V0) 0;
diff(x2d, k1) diff(x2d, k2) diff(x2d, k3) diff(x2d, k4) diff(x2d, V0) 0];
Sx = [x3 x5 x7 x9 x11 x1;X4 x6 x8 x10 x12 x2];
Sxd = dfdx * Sx + dfdth
结束
现在我想把这个矩阵传递给一个ODE求解器来解它。
实际上,我传递给求解器(ODE45):
[t1, sol1] = 1“S1 '、tspan1 IC1);
其中S1为上述fn, tspan1为时间跨度,IC1为包含12个IC(均为0)的向量。
顺便说一下,它不起作用。我认为这与函数的输出格式有关(即符号矩阵)
我该如何解决这个问题?
先谢谢你,
加布里
1评论
明星黾
明星黾 8月8日
以你现在的形式是行不通的。
首先,后面的第一个作业 信谊 必须:
X =符号(“X”12 [1]);
然后,它必须计算返回的列向量,作为一阶微分方程的列向量。
有了这个,就可以用了 matlabFunction 来创建一个匿名函数,可以在MATLAB中使用数值微分方程积分函数。
我不知道你想要做什么,所以我甚至无法开始把它放在正确的形式。你必须那样做。

登录评论。

答案(1)

沃尔特·罗伯森
如果你
信谊t
信谊12 X [1]
然后应用你的函数体,然后Sxd将以2 x 6数组的形式出现。但是,ode函数的输出必须是列向量。
符号计算效率很低。让我们看看能否创建一个合适的数值函数:
> > matlabFunction (Sxd (:),“var”, {X} t,)
错误使用sym/matlabFunction> checkvars子集
免费的变量'k1,k2,k3,u'必须包含在'Vars'值中。
答案是否定的。您的计算包括符号变量k1, k2, k3和u,它们都没有定义,也都不是函数的参数。您的输出本质上是符号的,这对于ode*()系列函数是不允许的。
3评论
沃尔特·罗伯森
如果您的k1、k2、k3和u都是数字,那么您可以使用文档中关于odeFunction的第一个示例中显示的命令来创建一个匿名函数,该函数可以传递给ode45或类似的函数。
然而,就目前情况来看,这些是符号变量,而不是数字变量,没有ode*()例程可以处理这个。
您可以使用dsolve()来获得符号解决方案。

登录评论。

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!