Fredholm第二类积分方程的MATLAB代码实现(1)
生活随笔
收集整理的這篇文章主要介紹了
Fredholm第二类积分方程的MATLAB代码实现(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這是《The Numerical Solution of Integral Equations of the Second Kind》書上的例題代碼實現,基于MATLAB來編寫的,對應于這一篇的Python代碼點擊打開鏈接
本代碼主要實現Fredholm integral equations of the second kind,方程如下:?
? ? ? ? ?lamda*x(t)-integrate(K(t,s)*x(s))ds=y(t),a=0<=t<=b,K(t,s)取exp(s*t)?
首先,我們給定兩個精確解exp(-t)cos(t)和sqrt(t),求出其對應的y(t),然后再來反解x(t).更詳細說明可?
參見《The Numerical Solution of Integral Equations of the Second Kind》P30-34.
首先定義各種函數,保存為.m文件
第一步:定義核函數
function k=func_k(s,t) k=exp(s*t); %k的表達式第二步:定義給定的精確解x
function x=func_x(t) x=exp(-t)*cos(t); %x的表達式第三步:用精確解求出y
function y=func_y(x,k,a,b,lamda) syms t s; y=subs(lamda*x-int(x*k,t,a,b),t,s); % 用符號積分求出y的表達式,并統一y中的變量為s第四步:求方程組的右端項(相當于Ax=b中的b)
function f=func_f(y,a,b,lamda,n) syms s; f=ones(n,1); for i=1:nf(i)=int(y*s^(i-1),s,a,b); %這里用符號積分求y*s^(i-1) end第五步:求系數c
function c=solve_c(f,a,b,lamda,n) % B=ones(n,n); %用于存放系數矩陣 for i=1:nfor j=1:nB(i,j)=-b^(i+j-1)/(factorial(j-1)*(i+j-1));endB(i,i)=lamda+B(i,i); end c=B\f; %求c,其為一個n維的向量 end第六步:求xn
function xn=solve_xn(y,c,a,b,lamda,n) syms t; m=0; for i=0:n-1m=m+c(i+1)*t^i/factorial(i); end xn=(y+m)/lamda;第七步:求無窮范數
function E=err(x,xn,a,b) syms s t; tt=a:0.1:b; E=vpa(norm(subs(subs(x-xn,s,t),t,tt),Inf),20); %取區間[a,b]中的離散點,求無窮范數以上是定義好的函數,接下來再寫一個主函數文件,然后運行此文件即可。以上的核函數,x函數等可以改成自己想要的!!!
clear n=input('please input n:') a=input('please input a:') b=input('please input b:') lamda=input('please input lamda:') e=ones(n,1); %用來存誤差 syms s t; for i=1:nk=func_k(s,t);x=func_x(t);y=func_y(x,k,a,b,lamda);f=func_f(y,a,b,lamda,i);c=solve_c(f,a,b,lamda,i);xn=solve_xn(y,c,a,b,lamda,i);e(i)=err(x,xn,a,b); end e if n==10figure(1)tt=a:0.1:b;plot(tt,vpa(subs(subs(x-xn,s,t),t,tt),20),'r--')xlabel('t'), ylabel('error')title('error,n=10,a=0,b=1,lamda=5') end運行結果我就不放上來了,因為這臺電腦沒有按MATLAB,o(╥﹏╥)o
總結
以上是生活随笔為你收集整理的Fredholm第二类积分方程的MATLAB代码实现(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四阶龙格库塔法求解微分方程【MATLAB
- 下一篇: IE7和IE8的CSS样式不兼容