微分方程數值解法的matlab程式
微分方程數值解法的matlab程式
尤拉法
clear
clc
syms x y
f=2*x;
a=0;
b=10;
y0=0;
h=0.1;
n=(b-a)/h+1;
xx=zeros(n,1);
yy=zeros(n,1);
for i=1:n
xx(i)=a+h*(i-1);
end
yy=zeros(n,1);
yy(1)=y0;
for i=2:n
yy(i)=yy(i-1)+h*subs(f,{x,y},{xx(i-1),yy(i-1)});
end
ff1=[xx,yy];
改進尤拉法
clear
clc
syms x y
f=3*x^2;
a=0;
b=10;
y0=0;
h=0.1;
n=(b-a)/h+1;
xx=zeros(n,1);
yy=zeros(n,1);
for i=1:n
xx(i)=a+h*(i-1);
end
yy=zeros(n,1);
yy(1)=y0;
for i=2:n
yy(i)=yy(i-1)+h*subs(f,{x,y},{xx(i-1),yy(i-1)});
p=zeros(4,1);
p(1)=yy(i);
for j=2:4
p(j)=yy(i-1)+(h/2)*(subs(f,{x,y},{xx(i-1),yy(i-1)})+subs(f,{x,y},{xx(i),p(j-1)}));
end
yy(i)=p(4);
end
ff1=[xx,yy];
龍格庫塔法
clear
clc
syms x y
f=3*x^2;
a=0;
b=10;
y0=0;
h=0.1;
n=(b-a)/h+1;
xx=zeros(n,1);
yy=zeros(n,1);
for i=1:n
xx(i)=a+h*(i-1);
end
yy=zeros(n,1);
yy(1)=y0;
for i=2:n
k1=subs(f,{x,y},{xx(i-1),yy(i-1)});
k2=subs(f,{x,y},{xx(i-1)+h/2,yy(i-1)+h/2*k1});
k3=subs(f,{x,y},{xx(i-1)+h,yy(i-1)-h*k1+2*h*k2});
yy(i)=yy(i-1)+h/6*(k1+4*k2+k3);
end
ff1=[xx,yy];
隱式龍格庫塔法
%隱式比顯式有更高的精度,但是因為求解非線性或者線性方程組導致計算量過大。
%下面編寫三階隱式
clear
clc
syms x y
f=3*x^2;
a=0;
b=10;
y0=0;
h=0.1;
n=(b-a)/h+1;
xx=zeros(n,1);
yy=zeros(n,1);
for i=1:n
xx(i)=a+h*(i-1);
end
yy=zeros(n,1);
yy(1)=y0;
c=[(5-15^0.5)/10,0.5,(5+15^0.5)/10];
b=[5/18,4/9,5/18];
aa=[5/36,(10-3*15^0.5)/45,(25-6*15^0.5)/180;(10+3*15^0.5)/72,2/9,(10-3*15^0.5)/72;(25+6*15^0.5)/180,(10+3*15^0.5)/45,5/36];
for i=2:n
syms k1 k2 k3
k1=subs(f,{x,y},{xx(i-1)+c(1)*h,yy(i-1)+h*(aa(1,1)*k1+aa(1,2)*k2+aa(1,3)*k3)});
k2=subs(f,{x,y},{xx(i-1)+c(2)*h,yy(i-1)+h*(aa(2,1)*k1+aa(2,2)*k2+aa(2,3)*k3)});
k3=subs(f,{x,y},{xx(i-1)+c(3)*h,yy(i-1)+h*(aa(3,1)*k1+aa(3,2)*k2+aa(3,3)*k3)});
yy(i)=yy(i-1)+h/6*(k1+4*k2+k3);
end
ff1=[xx,yy];
半隱式龍格庫塔法
%半隱式比隱式計算量更小,並且精度相當。
%下面編寫二階半隱式
clear
clc
syms x y
f=6*x;
A=diff(f,y,1);
a=0;
b=10;
y0=0;
h=0.1;
n=(b-a)/h+1;
xx=zeros(n,1);
yy=zeros(n,1);
for i=1:n
xx(i)=a+h*(i-1);
end
yy=zeros(n,1);
yy(1)=y0;
c=[(5-15^0.5)/10,0.5,(5+15^0.5)/10];
b=[5/18,4/9,5/18];
aa=[5/36,(10-3*15^0.5)/45,(25-6*15^0.5)/180;(10+3*15^0.5)/72,2/9,(10-3*15^0.5)/72;(25+6*15^0.5)/180,(10+3*15^0.5)/45,5/36];
omig1=(6+6^0.5)/6;
omig2=(6-6^0.5)/6;
c2=0.17378667;
b1=-0.41315432;
b2=1-b1;
for i=2:n
k1=(1-omig1*subs(A,{x,y},{xx(i-1),yy(i-1)}))^(-1)*subs(f,{x,y},{xx(i-1),yy(i-1)});
k2=(1-omig2*subs(A,{x,y},{xx(i-1)+c2*h,yy(i-1)+h*c2*k1}))^(-1)*subs(f,{x,y},{xx(i-1)+c2*h,yy(i-1)+h*c2*k1});
yy(i)=yy(i-1)+h*(b1*k1+b2*k2);
end
ff1=[xx,yy];
相關文章
- 實驗四 常微分方程的數值解(android)Android
- [常微分方程]Lecture 1: ODE的幾何解法:方向場、積分曲線
- [MatLab]學習筆記2:MatLab數值資料Matlab筆記
- Matlab檔案IO--文字與數值的讀Matlab
- Matlab檔案IO--文字與數值的寫Matlab
- MATLAB學習筆記:數值積分Matlab筆記
- Matlab 隨機生成兩個數值之間的隨機數Matlab隨機
- matlab如何給未知數及包含未知數的函式賦值Matlab函式賦值
- MATLAB插值Matlab
- 【matlab程式設計】matlab隨機數函式Matlab程式設計隨機函式
- 玩轉matlab之一維 gauss 數值積分公式及matlab原始碼Matlab公式原始碼
- matlab中怎麼給符號變數賦值Matlab符號變數賦值
- MATLAB(2)資料型別一(數值型和…Matlab資料型別
- Python小白的數學建模課-09 微分方程模型Python模型
- 最難數獨的快速解法 - pythonPython
- 一分鐘瞭解“Matlab統計數值頻率和個數tabulate”Matlab
- matlab之在workspace中檢視子程式變數Matlab變數
- JavaScript 浮點數陷阱及解法JavaScript
- 一階微分方程
- 玩轉 matlab 之二維 gauss 數值積分公式使用及 matlab 原始碼(1)-常量區間Matlab公式原始碼
- 影象放大並進行BiCubic插值 Matlab/C++程式碼MatlabC++
- 程式設計和數值計算平臺:MATLAB R2023a Mac啟用版程式設計MatlabMac
- 席位分配問題——慣例Q值法和d'hondt法的MATLAB程式Matlab
- 【演算法】求眾數-js解法演算法JS
- matlab中怎樣隨機生成一個最大值為N的正整數??Matlab隨機
- 常微分方程選題
- 筆記 常微分方程筆記
- MATLAB一維插值和二維插值 比較Matlab
- 數值積分公式及龍貝格(Romberg)演算法實現matlab公式演算法Matlab
- Matlab統計矩陣內各值出現次數以及所佔比例Matlab矩陣
- 彩色影像二值化函式(matlab)函式Matlab
- 小波分析的matlab程式Matlab
- matlab中的偽隨機數原理Matlab隨機
- Shell 程式設計 : 數值,字元,字串程式設計字元字串
- matlab練習程式(對應點集配準的四元數法)Matlab
- 動態修改 NodeJS 程式中的變數值NodeJS變數
- 牛頓插值 C++ 和 Matlab實現C++Matlab
- 幾數之和分析,解法,優化和總結優化