微分方程數值解法的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];
相關文章
- 微分方程的數值解法 6
- 【數值計算方法】常微分方程數值解-數值實驗
- matlab練習程式(線性常微分方程組矩陣解)Matlab矩陣
- 【數值計算方法】線性方程組的迭代解法-數值實驗
- 數值分析:線性方程組的直接解法(上)
- [MatLab]學習筆記2:MatLab數值資料Matlab筆記
- Matlab 隨機生成兩個數值之間的隨機數Matlab隨機
- matlab如何給未知數及包含未知數的函式賦值Matlab函式賦值
- 玩轉matlab之一維 gauss 數值積分公式及matlab原始碼Matlab公式原始碼
- matlab中怎麼給符號變數賦值Matlab符號變數賦值
- 程式設計和數值計算平臺:MATLAB R2023a Mac啟用版程式設計MatlabMac
- Python小白的數學建模課-09 微分方程模型Python模型
- 最難數獨的快速解法 - pythonPython
- 一道數學題的解法
- 玩轉 matlab 之二維 gauss 數值積分公式使用及 matlab 原始碼(1)-常量區間Matlab公式原始碼
- 數學建模中常用的30個MATLAB程式和函式Matlab函式
- MATLAB R2023a for Mac(程式設計和數值計算平臺) v9.14.0.2337262啟用版MatlabMac程式設計
- Leetcode 169:求眾數(最詳細的解法!!!)LeetCode
- 一道求餘數小學數學題的解法
- MATLAB一維插值和二維插值 比較Matlab
- 彩色影像二值化函式(matlab)函式Matlab
- 奇異值分解以及matlab實現Matlab
- 數值積分公式及龍貝格(Romberg)演算法實現matlab公式演算法Matlab
- matlab練習程式(對應點集配準的四元數法)Matlab
- 【演算法】求眾數-js解法演算法JS
- 一階微分方程
- 微分方程筆記筆記
- 淺談 [NOIP 2023]三值邏輯 無限種解法
- 力扣 1512. 好數對的數目(超簡單暴力解法)力扣
- 【小 w 的代數】(提供一種 n^2 log 的解法)
- 基於Matlab Coder將matlab程式碼轉換成c程式碼MatlabC程式
- 使用MATLAB compiler將matlab程式轉成獨立應用程式exeMatlabCompile
- python呼叫matlab程式,MATLAB 指令碼打包為 exe可執行程式PythonMatlab指令碼行程
- 常數變易法求解非齊次線性微分方程
- 數值的整數次方
- matlab計算含有未知數的矩陣Matlab矩陣
- 筆記 常微分方程筆記
- 常微分方程選題