% 此程序包含求任意点高斯积分节点和对应的Gauss的求解系数(同时也编写了Lagrange插值公式)
% 并对给定函数用Gauss型求积公式求积分
clc
clear
syms x;
nn=inputdlg({'请输入高斯节点数','输出数据的有效数字位数'},'Gauss_Legendre 积分公式',1,{'5','6'});
n=str2num(char(nn(1)));
nnn=str2num(char(nn(2)));
F=x^2-1;
Pn=diff(F^n,'x',n)/(2.^n*gamma(n+1));
root=roots(sym2poly(Pn));
im_node=sort(root);
disp([num2str(n),'点高斯积分节点 ', num2str(im_node',nnn)]);
syms xx xxx;
for k=1:n
LL(k)=xxx;
end
%下面是Lagrange插值公式
for k=1:n
for kk=1:n
if kk~=k
LL(k)=LL(k)*(xx-im_node(kk))/(im_node(k)-im_node(kk));
end
end
end
LL=LL/xxx;
A=int(LL,xx,-1,1);
AA=double(vpa(simplify(A)));
disp([num2str(n),'点Gauss的求解系数 ',num2str(AA,nnn)]);
%假设积分区间为[a,b]
aa=inputdlg({'请输入积分函数下限a','请输入积分函数上限b',},'Gauss_Legendre 积分公式',1,{'0','1'});
a=str2num(char(aa(1)));
b=str2num(char(aa(2)));
jifen=0;
fac=(b-a)/2;
suanli=inline('exp(x.^x)'); %给定的公式,该积分准确值为pi
for k=1:n
jifen=jifen+fac*A(k)*suanli((a+b)/2+fac*im_node(k));
end
zhi=vpa(jifen,20);
zhhi=double(zhi);
disp(['积分的真实值为pi,Gauss_Legendre积分值为 ',num2str(zhhi,nnn)])