ODE45——求解状态变量(微分方程组)

ODE45——求解状态变量(微分方程组)ode45 函数 ode45 实际上是数值分析中数值求解微分方程组的一种方法 4 阶五级 Runge Kutta 算法 调用方法 t x ode45 Fun tspan x0 options pars t x ode45 Fun tspan x 0 options pars t x ode45 Fun tspan x0 options pars 其实这种方程的每一个状态变量都是 t 的函数

ode45函数

ode45实际上是数值分析中数值求解微分方程组的一种方法,4阶五级Runge-Kutta算法。

  • 调用方法
    [ t , x ] = o d e 45 ( F u n , t s p a n , x 0 , o p t i o n s , p a r s ) [t,x]=ode45(Fun,tspan,x_0,options,pars) [t,x]=ode45(Fun,tspan,x0,options,pars)

其实这种方程的每一个状态变量都是t的函数,我们可以从现代控制理论的状态空间来想。因此返回 [ t , x ] [t,x] [t,x],其中t是一个列向量,x是 n × n n\times n n×n的矩阵,它的每一列就是其中一个状态变量随t的变化值。

F u n Fun Fun就是你要求解的微分方程组,微分方程组必须化成现代控制理论中的一阶微分方程组形式,之后定义.m函数亦或是匿名函数 f = @ ( t , x ) f=@(t,x) f=@(t,x)来描述微分方程组的右边部分,并且是列向量。(注意匿名函数一定是先t后x并且一定有t占位)

t s p a n tspan tspan就是你要求解的t区间, x 0 x_0 x0就是初始状态。 o p t i o n s options options是一些选项。

  • 例子
    在这里插入图片描述

f = @(t,x)[-x(2)-x(3);x(1)+0.2*x(2);0.2+(x(1)-5.7)*x(3)]; [t,y] = ode45(f,[0,100],[0;0;0]); plot(t,y); figure; plot3(y(:,1),y(:,2),y(:,3)) 

在这里插入图片描述

求解 R i c c a t i Riccati Riccati 微分方程

在这里插入图片描述

P1 = [1 0 0;0 3 0;0 0 5]; [t,p] = ode45(@riccati,[0.5,0],P1(:)); plot(t,p) function U=riccati(t,x) A = [6 6 17;1 0 -1;-1 0 0]; B = [0 0 0;0 4 2;0 2 1]; C = [1 2 0;2 8 0;0 0 4]; p = [x(1),x(2),x(3);x(4),x(5),x(6);x(7),x(8),x(9)]; K = A'*p+p*A+p*B*p+C; U=[K(1,:)';K(2,:)';K(3,:)']; end 

注意这个地方给的是t=0.5s时的状态值,但是Runge-Kutta算法可以倒着算,因此tspan写成[0.5,0],这个时候的初始值就是P1(0.5)。

  • 设置ode45精度
    主要是绝对精度和相对精度,设置方式如下:

clc;clear;close all; f = @(t,x)[x(1)*(x(1)^2+x(2)^2-2)-4*x(1)*x(2)^2;4*x(1)^2*x(2)+x(2)*(x(1)^2+x(2)^2-2)]; option = odeset('RelTol',1e-8,'AbsTol',[1e-8;1e-8]); [t,y] = ode45(f,[0,10],[0.5;0.5],option); plot(t,y(:,1),t,y(:,2)) 

RelTol为相对精度,一维数据,AbsTol相对精度,要给符合状态变量的维数。之后把option传入ode45即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220083.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午9:17
下一篇 2026年3月17日 下午9:17


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号