配置法 求解1D第二类线性的Fredholm积分方程 +MATLAB

function f=en_f(x)
f=x;
end
function f=fn(x)
f=x/2-1/3;
%MATLAB 将函数 传入另一个函数,比如这里的f是另一个函数传过来的,所以
%调用时,需要加@
%如 t=Gauss_integral1(@fn,0,1)%这是一个任意连续函数 都可以数值积分 的程序
function G = Gauss_integral(f,a,b)%传入一个连续函数f(x),在积分区间[a,b]上的数值积分为G
%高斯3%q=[-sqrt(15)/5 ,5/9;
%           0   ,8/9;
%   sqrt(15)/5  ,5/9]
%高斯7点
q=  [-0.9491079123427585,0.1294849661688697;
     -0.7415311855993945,0.2797053914892766;
     -0.4058451513773972,0.3818300505051189;
      0.0000000000000000,0.4179591836734694;
      0.4058451513773972,0.3818300505051189;
      0.7415311855993945,0.2797053914892766;
      0.9491079123427585,0.1294849661688697];
x =q(:,1);%积分节点 需要改变,作线性变换
weight =q(:,2);%权函数,划到其他区间不需要改变

%做一个变换,使得t属于[-1,1]
t = (b - a)/2.*x + (b + a)/2;
J=(b - a)/2;%类似Jacobi系数
G = sum(weight .* f(t)) * J;
function A=Stiff(N,x,h)
A=sparse(N,N);
for i=1:N
   for j=1:N
       if(j==1)
           a=x(j);
           b=x(j+1);
           phi=@(y) ker(x(i),y).*(b-y)/h;
           %注意@phi 这里的phi是一个用function 定义的函数
           %Gauss_integral1(@phi,a,b)
           %但这里是通过定义句柄函数,不用加@
           A(i,j)=Gauss_integral(phi,a,b);
       elseif(j==N)
           a=x(j-1);
           b=x(j);
           phi=@(y)ker(x(i),y).*(y-a)/h;
           A(i,j)=Gauss_integral(phi,a,b);
       else
           a=x(j-1);
           b=x(j);
           c=x(j+1);
           phil=@(y)ker(x(i),y).*(y-a)/h;
           phir=@(y)ker(x(i),y).*(c-y)/h;
           A(i,j)=Gauss_integral(phil,a,b)+Gauss_integral(phir,b,c);    
       end    
   end
end
end
function F=Load(N,x,h)
F=sparse(N,1);
for i=1:N
    F(i)=fn(x(i));
end
end
clc,clear
a=0;b=1;
N=20;%单元个数
h=(b-a)/(N-1);
x=a:h:b
I=eye(N,N);
A=Stiff(N,x,h)
B=Load(N,x,h)
disp('数值解')
X=(I-A)\B
%真实解图
plot(x,en_f(x),'r');
hold on
%数值解图
plot(x,X,'bo');

你可能感兴趣的:(Computational,Mathematics专栏,数学大类专栏,matlab,数学)