簡體   English   中英

如何在Matlab中求解常微分方程組(ODE)

[英]how to solve a system of Ordinary Differential Equations (ODE's) in Matlab

我必須解決以下形式的常微分方程組:

dx/ds = 1/x * [y* (g + s/y) - a*x*f(x^2,y^2)]
dy/ds = 1/x * [-y * (b + y) * f()] - y/s - c

其中x和y是我需要找出的變量,s是自變量; 其余的都是常數。 我試圖用ode45來解決這個問題,到目前為止沒有成功:

y = ode45(@yprime, s, [1 1]);

function dyds = yprime(s,y)
    global g a v0 d
    dyds_1 = 1./y(1) .*(y(2) .* (g + s ./ y(2)) - a .* y(1) .* sqrt(y(1).^2 + (v0 + y(2)).^2));
    dyds_2 = - (y(2) .* (v0 + y(2)) .* sqrt(y(1).^2 + (v0 + y(2)).^2))./y(1) - y(2)./s - d;
   dyds = [dyds_1; dyds_2];
return

其中@yprime有方程組。 我收到以下錯誤消息:

YPRIME返回長度為0的向量,但初始條件向量的長度為2.YPRIME返回的向量和初始條件向量必須具有相同數量的元素。

有任何想法嗎? 謝謝

當然,你應該看看你的功能yprime 使用一些與您的問題共享差異狀態變量數量的簡單模型,看一下這個例子。

function dyds = yprime(s, y)
    dyds = zeros(2, 1);
    dyds(1) = y(1) + y(2);
    dyds(2) = 0.5 * y(1);
end

yprime必須返回一個包含兩個右邊值的列向量。 輸入參數s可以忽略,因為您的模型與時間無關。 您展示的示例有點困難,因為它不是dy / dt = f(t,y)形式。 作為第一步,您必須重新排列方程式。 x重命名為y(1)y重命名為y(2)

此外,你確定你的global ga v0 d不是空的嗎? 如果這些變量中的任何一個仍然未初始化,您將使用空矩陣乘以狀態變量,最終導致返回空向量dyds 這可以測試

assert(~isempty(v0), 'v0 not initialized');

yprime ,或者您可以使用調試斷點。

ODE求解器的語法是[sy]=ode45(@yprime, [1 10], [2 2])

並且您不需要在您的情況下進行元素操作,而不是.*只需使用* y(:,1)相對s繪制初始條件[2 2]和參數值:g = 1; a = 2; v0 = 1; d = 1.5;

y(:,2)對比s

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM