求解耦合非线性微分方程

问题描述 投票:1回答:2

我的微分方程如下:

%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'.  

有没有一种更干净的方式可以做到这一点?

matlab differential-equations
2个回答
2
投票

我假设您正在脚本中运行它,这意味着您的函数ddtlocal function而不是nested function。这意味着它无权访问矩阵变量m11等。另一个问题是,您将需要以tddt的特定值评估矩阵变量,而当前代码则无法。做。

这里是另一种适合您的设置方式:

% 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);

0
投票

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

mat = @(t) sin(cos(w*t))
function xprime = ddt(t,x)
    a = mat(t) + 5 ; 
    b = 5;
    ddt = [ a, b; -b, -a]*x
end

也应作为内部程序使用。

© www.soinside.com 2019 - 2024. All rights reserved.