求解耦合非线性微分方程
Solving coupled nonlinear 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):
t = linspace(0,T,100) ; % Arbitrary 100
x0 = (1 0); %Init cond
[tf,xf] = ode45(@ddt,t,x0)
function xprime = ddt(t,x)
ddt = [m11*x(1)+m12*x(2) ; m12*x(1)+m12*x(2) ]
end
我得到的第一个错误是
Undefined function or variable 'M11'.
有没有更简洁的方法可以做到这一点?
我假设您在脚本中 运行 this,这意味着您的函数 ddt
是 local function instead of a nested function。这意味着它无法访问您的矩阵变量 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
的 return 值是 xprime
,而不是 ddt
。然后如前一个答案中所述,定义时的 mm1
应该给出错误,因为未定义 t
。但是,即使在定义时有可用的 t
值,它也与调用过程 ddt
所用的 t
不同。
mat = @(t) sin(cos(w*t))
function xprime = ddt(t,x)
a = mat(t) + 5 ;
b = 5;
ddt = [ a, b; -b, -a]*x
end
应该也作为内部程序工作。
我有一个微分方程如下:
%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):
t = linspace(0,T,100) ; % Arbitrary 100
x0 = (1 0); %Init cond
[tf,xf] = ode45(@ddt,t,x0)
function xprime = ddt(t,x)
ddt = [m11*x(1)+m12*x(2) ; m12*x(1)+m12*x(2) ]
end
我得到的第一个错误是
Undefined function or variable 'M11'.
有没有更简洁的方法可以做到这一点?
我假设您在脚本中 运行 this,这意味着您的函数 ddt
是 local function instead of a nested function。这意味着它无法访问您的矩阵变量 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
的 return 值是 xprime
,而不是 ddt
。然后如前一个答案中所述,定义时的 mm1
应该给出错误,因为未定义 t
。但是,即使在定义时有可用的 t
值,它也与调用过程 ddt
所用的 t
不同。
mat = @(t) sin(cos(w*t))
function xprime = ddt(t,x)
a = mat(t) + 5 ;
b = 5;
ddt = [ a, b; -b, -a]*x
end
应该也作为内部程序工作。