Matlab 求解耦合非线性微分方程

Matlab 求解耦合非线性微分方程,matlab,differential-equations,Matlab,Differential Equations,我有一个微分方程,如下所示: %d/dt [x;y] = [m11 m12;m11 m12][x;y] mat = @(t) sin(cos(w*t)) m11 = mat(t) + 5 ; m12 = 5; m21 = -m12 ; m22 = -m11 ; 所以我的矩阵特别依赖于t。出于某种原因,我用ode45解决这个问题非常困难。我的想法如下(我想在定义的时间T求解x,y): 我得到的第一个错误是 Undefined function or variable 'M11'. 有没有

我有一个微分方程,如下所示:

%d/dt [x;y] = [m11 m12;m11 m12][x;y]
mat = @(t) sin(cos(w*t))
m11 = mat(t) + 5 ; 
m12 = 5;
m21 = -m12 ;
m22 = -m11 ;
所以我的矩阵特别依赖于t。出于某种原因,我用ode45解决这个问题非常困难。我的想法如下(我想在定义的时间T求解x,y):

我得到的第一个错误是

Undefined function or variable 'M11'.  

有没有更干净的方法可以实现这一点?

我假设您在脚本中运行此功能,这意味着您的函数
ddt
是一个而不是一个。这意味着它无法访问您的矩阵变量
m11
,等等。另一个问题是,您需要在
ddt
中以
t
的特定值评估矩阵变量,而您当前的代码不这样做

以下是另一种设置适合您的东西的方法:

% Define constants:
w = 1;
T = 10;
t = linspace(0, T, 100);
x0 = [1 0];

% Define anonymous functions:
fcn = @(t) sin(cos(w*t));
M = {@(t) fcn(t)+5, 5; -5 @(t) -fcn(t)-5};
ddt = @(t, x) [M{1, 1}(t)*x(1)+M{2, 1}*x(2); M{1, 2}*x(1)+M{2, 2}(t)*x(2)];

% Solve equations:
[tf, xf] = ode45(ddt, t, x0);

一个明显的错误是函数
ddt
的返回值是
xprime
,而不是
ddt
。然后,如前一个答案中所述,定义时的
mm1
应给出一个错误,因为未定义
t
。但是,即使定义中存在可用的
t
值,它也与调用过程
ddt
t
不同

mat=@(t)sin(cos(w*t))
函数xprime=ddt(t,x)
a=垫(t)+5;
b=5;
滴滴涕=[a,b;-b,-a]*x
结束
也应作为内部程序工作

% Define constants:
w = 1;
T = 10;
t = linspace(0, T, 100);
x0 = [1 0];

% Define anonymous functions:
fcn = @(t) sin(cos(w*t));
M = {@(t) fcn(t)+5, 5; -5 @(t) -fcn(t)-5};
ddt = @(t, x) [M{1, 1}(t)*x(1)+M{2, 1}*x(2); M{1, 2}*x(1)+M{2, 2}(t)*x(2)];

% Solve equations:
[tf, xf] = ode45(ddt, t, x0);