網站首頁 編程語言 正文
實驗任務
(一)常微分方程的符號計算和數值解法基本操作
1、課上例題:1、2、3、4
(二)專題實驗(梯形格式)
編寫梯形公式的程序,要求:
- 程序要有通用性,例如:
??????????function?[t,y]=tixing(f,a,b,y0,N,mytol)
??????????% 求解形式為y’=f(t,y)的常微分方程的梯形公式
??????????% a,b為自變量的取值范圍
??????????% y0為初始值
??????????% N表示對區間[a,b]剖分N等份
??% mytol表示允許誤差, 要求默認值為1e-6,用來作為校正終止的條件
- 以例題4中的方程作為測試方程,畫出數值解和精確解的圖形,并做圖例。在完成例4測試后,也可以再找其它方程作為測試方程。
(三)專題實驗(改進Euler格式)
編寫梯形公式的程序,要求:
(1)程序要有通用性,例如:
??????????function?[t,y]=GJ_Euler(f,a,b,y0,N)
??????????% 求解形式為y’=f(t,y)的常微分方程的改進Euler公式
??????????% a,b為自變量的取值范圍
??????????% y0為初始值
??????????% N表示對區間[a,b]剖分N等份
- 以例4中的方程作為測試方程,畫出數值解和精確解的圖形,并做圖例。在完成例4測試后,也可以再找其它方程作為測試方程。
(四)專題實驗(變形Euler格式)
編寫梯形公式的程序,要求:
(1)程序要有通用性,例如:
??????????function?[t,y]=BX_Euler(f,a,b,y0,N)
??????????% 求解形式為y’=f(t,y)的常微分方程的變形Euler公式
??????????% a,b為自變量的取值范圍
??????????% y0為初始值
??????????% N表示對區間[a,b]剖分N等份
- 以例4中的方程作為測試方程,畫出數值解和精確解的圖形,并做圖例。在完成例4測試后,也可以再找其它方程作為測試方程。
(五)專題實驗(邊值問題的有限差分方法)
編寫課上的算例1、算例2,要求:
其中pfun, qfun, rfun,是方程中的系數和右端函數p(x),q(x),r(x),一般程序中不用單字母作為函數名。ceshi 是對編寫的函數進行測試。myFD是有限差分方法的主程序,可以寫為下列形式:
function [x,y]=myFD(alpha,beta,a,b,N)
%求常微分方程邊值問題y’’+p(x)y’+q(x)y=r(x), a<x<b
?????????????????????????y(a)=alpha, y(b)=beta
% N表示對區間[a,b]剖分N等份
%返回值x為[a,b]的剖分節點,
%返回值y為剖分節點上的數值解
(2)對課程上的算例1和算例2進行測試,每一個算例都要求畫出數值解和精確解的圖形,并做圖例。測試的代碼寫在函數文件ceshi里,大家可以用其它方式編寫。
(六)自選實驗(可以不做)
1、編寫Euler公式、向后Euler公式的程序,要求同專題實驗(三);
2、在二階Runge-Kutta方法中選定適當的參數,編寫程序,要求同專題實驗(三)
實驗程序和實驗結果
1、實驗程序:
>> y=dsolve('Dy=y^2','x')
?
y =
?
???????????0
?-1/(C2 + x)
2、實驗程序:
>> y=dsolve('x*D2y-3*Dy=x^2','y(1)=0','y(5)=0','x')
?
y =
?
(31*x^4)/468 - x^3/3 + 125/468
3、實驗程序:
>> y=dsolve('Df=f+g','Dg=-f+g','f(0)=1','g(0)=2','t')
y =
??包含以下字段的 struct:
????g: [1×1 sym]
????f: [1×1 sym]
>> y.f
?
ans =
?
exp(t)*cos(t) + 2*exp(t)*sin(t)
?
>> y.g
?
ans =
?
2*exp(t)*cos(t) - exp(t)*sin(t)
4、實驗程序:
[x,y]=ode23(@funst,[0,1],pi/2);
yy=(x+pi/2)./cos(x);
plot(x,y,'*',x,yy,'-')
legend('數值解','解析解')
function?yp=funst(x,y)
yp=y*tan(x)+sec(x);
end
(二)專題實驗(梯形格式)
1、實驗程序:
?function?[x,y]=tixing(f,a,b,y0,N,mytol)
??% 求解形式為y’=f(t,y)的常微分方程的梯形公式
??% a,b為自變量的取值范圍
??% y0為初始值
??% N表示對區間[a,b]剖分N等份
??% mytol表示允許誤差, 要求默認值為1e-6,用來作為校正終止的條件
??%nargin表示參數個數
??if?nargin<=5
??????mytol=1e-6;
??end
??h=(b-a)/N;
??x=a:h:b;
??y(1)=y0;
??for?i=1:length(x)-1
??????y(i+1)=y(i)+h*f(x(i),y(i));
??????y1=y(i+1)+1;
??????while?abs(y(i+1)-y1)>=mytol
??????????y1=y(i+1);
??????????y(i+1)=y(i)+h/2*(f(x(i),y(i))+f(x(i+1),y1));
??????end
??end
?end
- 實驗程序:
先建立函數文件funst.m
function?yp=funst(x,y)
yp=y*tan(x)+sec(x);
end
求解程序:
[x,y]=tixing(@funst,0,1,pi/2,10);
yy=(x+pi/2)./cos(x);
plot(x,y,'*',x,yy,'-')
legend('數值解','解析解')
(三)專題實驗(改進Euler格式)
1、實驗程序:
function?[x,y]=GJ_Euler(f,a,b,y0,N)
??% 求解形式為y’=f(t,y)的常微分方程的梯形公式
??% a,b為自變量的取值范圍
??% y0為初始值
??% N表示對區間[a,b]剖分N等份
??% mytol表示允許誤差, 要求默認值為1e-6,用來作為校正終止的條件
??%nargin表示參數個數
??if?nargin<=5
??????mytol=1e-6;
??else
??????error
??end
??h=(b-a)/N;
??x=a:h:b;
??y(1)=y0;
??for?i=1:length(x)-1
??????y(i+1)=y(i)+h*f(x(i),y(i));
??????y(i+1)=y(i)+h/2*(f(x(i),y(i))+f(x(i+1),y(i+1)));
??end
?end
2、實驗程序:
先建立函數文件funst.m
function?yp=funst(x,y)
yp=y*tan(x)+sec(x);
end
求解程序:
[x,y]=GJ_Euler(@funst,0,1,pi/2,10);
yy=(x+pi/2)./cos(x);
plot(x,y,'*',x,yy,'-')
legend('數值解','解析解')
- 專題實驗(變形Euler格式)
- 實驗程序:
function?[x,y]=BX_Euler(f,a,b,y0,N)
??% 求解形式為y’=f(t,y)的常微分方程的梯形公式
??% a,b為自變量的取值范圍
??% y0為初始值
??% N表示對區間[a,b]剖分N等份
??% mytol表示允許誤差, 要求默認值為1e-6,用來作為校正終止的條件
??%nargin表示參數個數
??if?nargin<=5
??????mytol=1e-6;
??else
??????error
??end
??h=(b-a)/N;
??x=a:h:b;
??y(1)=y0;
??for?i=1:length(x)-1
??????y(i+1)=y(i)+h*f(x(i)+h/2,y(i)+h/2*f(x(i),y(i)));
??end
?end
- 實驗程序:
先建立函數文件funst.m
function?yp=funst(x,y)
yp=y*tan(x)+sec(x);
end
求解程序:
[x,y]=BX_Euler(@funst,0,1,pi/2,10);
yy=(x+pi/2)./cos(x);
plot(x,y,'*',x,yy,'-')
legend('數值解','解析解')
(五)專題實驗(邊值問題的有限差分方法)
1、實驗程序:
function?[x,y]=myFD(alpha,beta,a,b,N)
%求常微分方程邊值問題y''+p(x)y’+q(x)y=r(x),a<x<b,y(a)=alpha,y(b)=beta
% N表示對區間[a,b]剖分N等份
%返回值x為[a,b]的剖分節點
%返回值y為剖分節點上的數值解
h=(b-a)/N;
x=a:h:b;
y=zeros(length(x),1);
y(1)=alpha; y(length(x))=beta;
f=zeros(N-1,1);
A=zeros(N-1,N-1);
for?i=1:N-1
????if?i==1
????????f(i,1)=h^2*rfun(x(2))-(1-h/2*pfun(x(2)))*alpha;
????????A(1,1)=-2+h^2*qfun(x(2));
????????A(1,2)=1+h/2*pfun(x(2));
????elseif?i==N-1
????????f(i,1)=h^2*rfun(x(N))-(1+h/2*pfun(x(N)))*beta;
????????A(N-1,N-2)=1-h/2*pfun(x(N));
????????A(N-1,N-1)=-2+h^2*qfun(x(N));
????else
????????f(i,1)=h^2*rfun(x(i+1));
????????A(i,i-1)=1-h/2*pfun(x(i+1));
????????A(i,i)=-2+h^2*qfun(x(i+1));
????????A(i,i+1)=1+h/2*pfun(x(i+1));
????end
end
y(2:N,1)=A\f;
y
end
2、實驗程序:
function?px=pfun(x)
px=3;
end
function?qx=qfun(x)
qx=2;
end
function?rx=rfun(x)
rx=sin(x)+3*cos(x);
end
[x,y]=myFD(0,1,0,pi/2,10);
yy=sin(x);
plot(x,y,'*',x,yy,'-')
legend('數值解','精確解')
- 實驗程序:
function?px=pfun(x)
px=2+x^2;
end
function?qx=qfun(x)
qx=1+2*x^2;
end
function?rx=rfun(x)
rx=-sin(x)+(2+x^2)*cos(x)+(1+2*x^2)*sin(x);
end
[x,y]=myFD(0,1,0,pi/2,10);
yy=sin(x);
plot(x,y,'*',x,yy,'-')
legend('數值解','精確解')
原文鏈接:https://blog.csdn.net/m0_62883956/article/details/126980422
- 上一篇:Pod 生命周期與重啟策略
- 下一篇:遞歸和迭代(深度優先,廣度優先)的差異
相關推薦
- 2022-09-24 React報錯之Object?is?possibly?null的問題及解決方法_React
- 2022-12-19 教你react中如何理解usestate、useEffect副作用、useRef標識和useCont
- 2022-06-16 Python實現視頻下載與合成的示例代碼_python
- 2023-03-28 Golang使用gzip壓縮字符減少redis等存儲占用的實現_Golang
- 2024-04-07 springboot后端接收前端傳數組參數方法
- 2022-06-10 python?PIL?Image?圖像處理基本操作實例_python
- 2022-03-10 使.NET6在開發時支持IIS_基礎應用
- 2022-09-01 C#實現簡單工廠模式_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支