前言:
近来发现龚纯、王正林编著《MATLAB语言常用算法程序集》附带的程序跑起来特别费时,所以参考众家之所长,优化了计算时间,随即公布分享出来交流学习。
此举非盈利目的,只愿中文互联网能多一点干货,也同时营造一下B站的学习氛围。
有任何问题欢迎在评论或者私信交流讨论!随缘回复!随缘更新!
1.1拉格朗日插值法
首先这是插值计算程序:
function y =LagrangeInterpolation(X, Y, x)
%% 拉格朗日插值计算
%输入的量: X是n+1个节点(x_i,y_i)(i = 1,2, ... , n+1)横坐标向量;
% Y是纵坐标向量;
% x是以向量形式输入的m个插值点;
%输出的量: y为m个插值构成的向量.
%% 注意
%拉格朗日插值法,一般情况下,n如果大于5,数据误差可能会非常大
%Lagrange插值方法的一个明显缺点:当插值节点发生变化或增减时,所有基函数都得重新计算
%% 范例
% x=0:0.5:3;
% y=[0 0.4794 0.8415 0.9975 0.9093 0.5985 0.1411];
% x0=0.1:0.5:2.9;
% LagrangeInterpolation(x, y, x0)
%% 检错
if(length(X) == length(Y))
n = length(X);
m = length(x);
else
error('▲▼▲▼▲▼▲▼警报: X和Y的维数不相等▲▼▲▼▲▼▲▼▲▼');
end
%% 计算
y=zeros(1,m);
for i = 1:m
s = 0.0;
for k = 1:n
p = 1.0; q1 = 1.0; c1 = 1.0;
for j = 1:n
if j~=k
p = p * (x(i) - X(j)) / (X(k) - X(j));
end
q1 = abs(q1 * (x(i) - X(j)));
c1 = c1 * j;
end
s = p * Y(k) + s;
end
y(i) = s;
end
最后这是插值多项式程序:
function [C,L,L1,l] = LagrangePolynomial(X,Y)
%% 求拉格朗日插值多项式和基函数
%输入的量: n+1个节点(x_i,y_i)(i = 1,2, ... , n+1)横坐标向量X,纵坐标向量Y
%输出的量: n次拉格朗日插值多项式L及其系数向量C,基函数l及其系数矩阵L1
%% 范例
% x=0:0.5:3;
% y=[0 0.4794 0.8415 0.9975 0.9093 0.5985 0.1411];
% [C,L,L1,l] = LagrangePolynomial(X,Y)
%% 检错
if(length(X) == length(Y))
m = length(X);
L1=zeros(m,m);
else
error('▲▼▲▼▲▼▲▼警报: X和Y的维数不相等▲▼▲▼▲▼▲▼▲▼');
end
%% 计算
for k = 1 : m
V = 1;
for i = 1 : m
if k ~= i
V = conv(V,poly(X(i))) / (X(k) - X(i));
end
end
L1(k, :) = V ;
l(k, :) = poly2sym(V);
end
C = Y * L1;
L = Y * l;
程序文件分享指路👉: https://www.aliyundrive.com/s/x36qNtk6jnC
欢迎【点赞】👍【投币】💴【收藏】✬【充电】⚡支持一下up主!