Matlab做函数的最佳平方逼近

该博客详细介绍了如何利用数值方法求解函数逼近问题,特别是针对指数函数f(x)=exp(x)的四次多项式逼近。通过建立正则表达式G*a=d的矩阵形式,利用MATLAB进行矩阵运算求解逼近系数a。在不同区间[-0.1,0.1],[-1,1],[-5,5]上进行了逼近,并展示了泰勒展开式、最佳逼近多项式和原函数的对比。
摘要由CSDN通过智能技术生成

原题是

 分析:f(x)=exp(x),权函数没说默认为1,基也给考虑用1,x^2,x^3,x^4……来进行拟合。区间范围有三个。得的逼近函数为S(x)。

且S(x)=:a_{0}\times 1+a_{1}\times x+a_{2}\times x^{2}+a_{3}\times x^{3} +a_{4}\times x^{4}

 因此问题就转化到了对多项式系数a的求解上。

介绍正则表达式:G*a=d

其中G:

 G中的参数\varphi _{0}=1 \varphi _{1}=x \varphi _{2}=x^{2} \varphi _{3}=x^{3} \varphi _{4}=x^{4},是从基空间中选取的

 (\varphi _{i}\varphi _{j}))表示的是\varphi _{i}\varphi _{j}的内积。

计算方法为\varphi _{i}\varphi _{j}的乘积再乘上权函数w(x)(这里为1)作为被积函数,以x为积分变量,在区间(a,b)上的积分值

 关于d

 关于a:

 其实就是方程组:

我们需要做的就是把G矩阵的逆求出来,然后d左乘上G的逆矩阵就得到系数矩阵a。(这些在matlab上都是比较好实现的)

对于在matlab的实现部分,先介绍2个需要用到的函数:

int(f,x,m,n)函数

可以帮助我们实现积分的计算,有四个参数,f是指被积函数,x是指积分变量,m、n分别代表了积分区间的下限和上限。例如  int(1,s,0,1)即为在0到1上对1积分的值 

>> int(1,x,0,1)
 
ans =
 
1

 Taylor函数:

帮助我们快速的求f(x)的泰勒展开式;taylor函数的使用格式不唯一,下面介绍一种用于实验。

>> syms x
>> f= exp(x);
>> taylor(f,x,'order',5)
 
ans =
 
x^4/24 + x^3/6 + x^2/2 + x + 1

上面的意思为求f(x)以x为变量的泰勒展开式的前五项(4阶)。

下面实现部分:

首先定义几个符号变量,以及上下限。

syms x m n
m=[-0.1,-1,-5];
n=[0.1,1,5];

然后确定原函数,积分变量,基,以及创建正则表达式Ga=d中的G,d矩阵,这里是4次所以加上常数项是G是(5,5)的格式,d是(5,1)的格式。

f = exp(x);
var =x;%积分变量
% 定义基空间
room =[1,x,x^2,x^3,x^4];   %基
% 定义一个5*5的矩阵,用来存放正则表达式Ga=d中G的元素。
G =magic(5);
% 定义一个5*1的矩阵D用来存放正则表达式Ga=d中d的元素。
D=[1;2;3;4;5];

然后分别求G和d

G:

for i=1:5
    for j=1:5
        G(i,j)=(int(room(i)*room(j),var,m,n));
    end
end
for i=1:5
    D(i,1)=int(f*room(i),var,m,n);
end

将G的逆与d相乘就得到了系数矩阵

a = inv(G)*D;

源码如下:

主函数:

syms x m n
m=[-0.1,-1,-5];
n=[0.1,1,5];
for i = 1:3
    get_xishu(exp(x),x,m(1,i),n(1,i))
end

get—xishu函数:

function get_xishu(~,~,m,n)
syms x 
f = exp(x);
var =x;%积分变量
% 定义基空间
room =[1,x,x^2,x^3,x^4];   %基

disp('关于f的4阶展开式(麦克劳林)')
Tay = taylor(f,x,'order',5)
% 定义一个5*5的矩阵,用来存放正则表达式Ga=d中G的元素。
G =magic(5);
% 定义一个5*1的矩阵D用来存放正则表达式Ga=d中d的元素。
D=[1;2;3;4;5];
% 获取G
for i=1:5
    for j=1:5
        G(i,j)=(int(room(i)*room(j),var,m,n));
    end
end
% 获取D:
for i=1:5
    D(i,1)=int(f*room(i),var,m,n);
end
% 最佳逼近的系数为:a
a = inv(G)*D;
disp('最佳逼近的系数为:')
disp(a)
disp('函数f的四次最佳逼近多项式:')
s = a(1,1)+a(2,1)*x+a(3,1)*x.^2+a(4,1)*x.^3+a(5,1)*x.^4
% 在 积分区间中分100个点用于取值和描图
x = m : (n-m)/100 :n;
% 计算每一个点在泰勒展开式下的取值
T=eval(Tay);
y =exp(x);
%计算每个点在四次最佳逼近多项中的取值
s = a(1,1)+a(2,1)*x+a(3,1)*x.^2+a(4,1)*x.^3+a(5,1)*x.^4;
figure()
plot(x,s,'r',x,y,'g',x,T,'black')
xlabel('x'),ylabel('y');
legend('最佳四次逼近','原函数','泰勒展开式');
title('xxxx');
end

运行结果:

当区间为[-0.1,0.1]时:

最佳逼近的系数为:
    1.0000
    1.0000
    0.5000
    0.1668
    0.0417

函数f的四次最佳逼近多项式:
 
s =
 
(716153323*x^4)/17179869184 + (1466830141885*x^3)/8796093022208 + (549755744457*x^2)/1099511627776 + (17592182552845*x)/17592186044416 + 1125899906876483/1125899906842624

 当区间为[-1,1]时:

关于f的4阶展开式(麦克劳林)
 
Tay =
 
x^4/24 + x^3/6 + x^2/2 + x + 1
 
最佳逼近的系数为:
    1.0000
    0.9980
    0.4994
    0.1761
    0.0436

函数f的四次最佳逼近多项式:
 
s =
 
(766974199037*x^4)/17592186044416 + (99157489229861*x^3)/562949953421312 + (35138793930433*x^2)/70368744177664 + (561798649278449*x)/562949953421312 + 1125934743734913/1125899906842624

当区间为[-5,5]时:

关于f的4阶展开式(麦克劳林)
 
Tay =
 
x^4/24 + x^3/6 + x^2/2 + x + 1
 
最佳逼近的系数为:
    1.9481
   -1.6065
   -0.2444
    0.5821
    0.1194

函数f的四次最佳逼近多项式:
 
s =
 
(134470535058449*x^4)/1125899906842624 + (655335705129991*x^3)/1125899906842624 - (17198029307343*x^2)/70368744177664 - (226095998786783*x)/140737488355328 + 68541602106177/35184372088832
 

 done!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不学习就run不掉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值