2017-11-10 185 views
1

我具有差分方程如下:求解耦合非线性微分方程

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

所以,我有我的基质是特别依赖于吨。出于某种原因,我正在用ode45解决这个难题。我的想法是做如下(我要解决的X,在定义一个时间T 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'. 

是否有一个更清洁我可以这样做吗?

回答

2

我假设你在脚本中运行此功能,这意味着您的功能ddtlocal function而不是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);