Matlab:求ODE系统的系数

标签 matlab differential-equations ode

我拥有所有数据和一个由三个方程组成的 ODE 系统,其中有 9 个未知系数(a1、a2、...、a9)。

dS/dt = a1*S+a2*D+a3*F
dD/dt = a4*S+a5*D+a6*F
dF/dt = a7*S+a8*D+a9*F

t = [1 2 3 4 5]
S = [17710 18445 20298 22369 24221]
D = [1357.33 1431.92 1448.94 1388.33 1468.95]
F = [104188 104792 112097 123492 140051]

如何使用 Matlab 求 ODE 的这些系数 (a1,..., a9)?

最佳答案

我不能在这上面花太多时间,但基本上你需要使用数学来将方程简化为更有意义的东西:

你的方程是这样的

dx/dt = A*x

因此解决方案是

x(t-t0) = exp(A*(t-t0)) * x(t0)

因此

exp(A*(t-t0)) = x(t-t0) * 伪(x(t0))

Pseudo 是 Moore-Penrose 伪逆。

编辑:再看一下我的解决方案,我没有正确计算伪逆。

基本上,Pseudo(x(t0)) = x(t0)'*inv(x(t0)*x(t0)'),如 x(t0) * Pseudo(x( t0)) 等于单位矩阵

现在你需要做的是假设每个时间步骤(1到2、2到3、3到4)都是一个实验(因此t-t0=1),所以解决方案是:

1-构建你的伪逆:

xt = [S;D;F];
xt0 = xt(:,1:4);

xInv = xt0'*inv(xt0*xt0');

2-获得指数结果

xt1 = xt(:,2:5);
expA =  xt1 * xInv;

3-获取矩阵的对数:

A = logm(expA);

由于 t-t0= 1,A 就是我们的解。

还有一个简单的证据可供检查

[t, y] = ode45(@(t,x) A*x,[1 5], xt(1:3,1));
plot (t,y,1:5, xt,'x')

enter image description here

关于Matlab:求ODE系统的系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16561746/

相关文章:

matlab - 每列最少 2 个连续非零值的最低起始行索引

image - Matlab:根据引用位置用另一个矩阵替换一个矩阵中的值

differential-equations - 在 Dymola 中解决 DAEs,为什么在执行 Patelides 算法后使用 DASSL 算法?

matlab - 如何使用 `datenum` 处理空字符串

java - 在没有 System.exit 的情况下关闭 Java GUI

matlab - 使用 matlab 求解 ode 系统

julia - 如何在DiscreteCallback中读取指定时间对应的值?

r - 在 deSolve 中的时间步更改参数值

python - scipy.integrate.odeint 和 scipy.integrate.ode 有什么区别?

python - 在Python中设置颂歌