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');