2017-11-10 114 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);