當前位置:編程學習大全網 - 編程語言 - 關於matlab編程的問題

關於matlab編程的問題

下面是我對這道題思路:

1:

對於第壹題的微分方程組在matlab中輸入[f,g]=dsolve('Df=exp(f*sin(t)+g)','Dg=exp(g*cos(t))+f','t')答案是 Explicit solution could not be found,即沒有解析解,因此只能求其近似解,也就是數值解。

求解微分方程的數值解需要知道“函數的初值”“自變量的範圍”,即f(0)=?,g(0)=?,變量t的取值範圍是多少,然後叠代運算,得到在給定定義域內的近似值。

2:

差分法也就是我們知道的歐拉法(Euler)"思想是用先前的差商近似代替倒數",直白壹些的編程說法即:f(i+1)=f(i)+h*f(x,y)其中h是設定的叠代步長,若精度要求不高,壹般可取0.01。在定義區間內叠代求解即可。

龍哥庫塔法壹般用於高精度的求解,即高階精度的改進歐拉法。

常用的是四階龍哥庫塔:

編程語言如下:

y(i+1)=y(i)+h*(k1+2*K2+2*k3+k4)/6;

k1=f(xi,yi)

k2=f(xi+h/2,yi+h*k1/2);

k3=f(xi+h/2,yi+h*k2/2);

k4=f(xi+h,yi+h*k3);

設置終止條件叠代求解。

思想就是這樣,代碼如下:

%% 龍哥庫塔or歐拉法求解微分方程

t=0:0.01:3; %自變量範圍

f = [];

g = [];

f(1) = 0.1; %f初值

g(1) = 1; %g初值

h=0.001;

for i=1:length(t)

%% 歐拉法

% f(i+1) =f(i)+h*(exp(f(i)*sin(t(i)))+g(i));

% g(i+1) =g(i)+h*(exp(g(i)*cos(t(i)))+f(i));

%% 龍哥庫塔

kf1 = exp(f(i)*sin(t(i)))+g(i);

kf2 = exp((f(i)+kf1*h/2)*sin(t(i)+h/2))+g(i);

kf3 = exp((f(i)+kf2*h/2)*sin(t(i)+h/2))+g(i);

kf4 = exp((f(i)+kf3*h)*sin(t(i)+h))+g(i);

f(i+1) = f(i) + h*(kf1+2*kf2+2*kf3+kf4)/6;

kg1 = exp(f(i)*cos(t(i)))+f(i);

kg2 = exp((f(i)+kg1*h/2)*cos(t(i)+h/2))+f(i);

kg3 = exp((f(i)+kg2*h/2)*cos(t(i)+h/2))+f(i);

kg4 = exp((f(i)+kg3*h)*cos(t(i)+h))+f(i);

g(i+1) = g(i) + h*(kg1+2*kg2+2*kg3+kg4)/6;

end

figure(1)

plot(t,f(1:length(t)),t,g(1:length(t)));

legend('f函數','g函數')

  • 上一篇:編程方是什麽意思?
  • 下一篇:蘇州市青田企業發展有限公司怎麽樣?
  • copyright 2024編程學習大全網