习题一:三弯矩法(Matlab实现)

目录

1、算法简介

 2、题目

 3、MATLAB代码


1、算法简介

 2、题目

 3、MATLAB代码

function yi=cubic_spline1(x,y,ydot,xi) 
% Cubic spline interpolation formula 
% X is the vector, all interpolation nodes; 
% Y is the vector and the function value at the interpolation node; 
% Ydot is the derivative value at the endpoint of the vector; 
% Xi is scalar, independent variable x;
% Yi is the function estimate of Xi;
n=length(x);ny=length(y); 
if n~=ny 
error('X and y are the same length'); 
return; 
end 
if isempty(ydot)==1 
ydot=[(y(2)-y(1))/(x(2)-x(1)) (y(n)-y(n-1))/(x(n)-x(n-1))];

end 
h=zeros(1:n);lambda=ones(1,n);mu=ones(1,n); 
M=zeros(n,1);d=zeros(n,1); 
for k=2:n 
h(k)=x(k)-x(k-1); 
if abs(h(k))<eps 
error('the DATA is error'); 
return; 
end 
end 
for k=2:n-1 
lambda(k)=h(k+1)/(h(k)+h(k+1));mu(k)=1-lambda(k); 
d(k)=6/(h(k)+h(k+1))... 
*((y(k+1)-y(k))/h(k+1)-(y(k)-y(k-1))/h(k)); 
end 
d(1)=6/h(2)*((y(2)-y(1))/h(2)-ydot(1)); 
d(n)=6/h(n)*(ydot(2)-(y(n)-y(n-1))/h(n)); 
A=diag(2*ones(1,n)); 
for i=1:n-1 
A(i,i+1)=lambda(i);A(i+1,i)=mu(i+1); 
end 
M=A\d; 
for k=2:n 
if x(k-1)<=xi & xi<=x(k) 
yi=M(k-1)/6/h(k)*(x(k)-xi)^3 
+M(k)/6/h(k)*(xi-x(k-1))^3 
+1/h(k)*(y(k)-M(k)*h(k)^2/6)*(xi-x(k-1)) 
+1/h(k)*(y(k-1)-M(k-1)*h(k)^2/6)*(x(k)-xi); 
return; 
end 
end 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
弯矩是一种常用的插值方,可以用于曲线拟合和数据平滑等应用。以下是一个 MATLAB弯矩代数插值的实现示例: ```matlab function [x_out, y_out] = cubic_spline(x_in, y_in) % 判断输入的数据是否符合要求 if length(x_in) ~= length(y_in) error('输入的 x 和 y 向量长度不一致'); end if ~(issorted(x_in)) error('输入的 x 向量必须是单调递增的'); end % 首先计算出每个区间的弯矩 n = length(x_in); h = diff(x_in); delta = diff(y_in) ./ h; lambda = [0; h(1:n-2); 0]; mu = [0; 2*(h(1:n-2) + h(2:n-1)); 0]; phi = [0; 6*diff(delta); 0]; % 利用弯矩求解系数矩阵的线性方程组 A = spdiags([lambda mu lambda], [-1 0 1], n, n); M = A \ phi; % 对于每个区间,计算出其插值函数并拼接成整个函数 x_out = x_in(1):0.01:x_in(end); y_out = zeros(size(x_out)); for i = 1:n-1 idx = (x_out >= x_in(i)) & (x_out <= x_in(i+1)); xx = x_out(idx) - x_in(i); yy = (M(i) / (6*h(i))) .* xx.^3 + (M(i+1) / (6*h(i))) .* (h(i)-xx).^3 + ... (delta(i) - M(i)*(h(i)/6)) .* xx + (delta(i+1) - M(i+1)*(h(i)/6)) .* (h(i)-xx); y_out(idx) = yy; end end ``` 这个函数接受两个向量 `x_in` 和 `y_in` 作为输入,分别表示已知数据点的横坐标和纵坐标。函数会先检查输入向量的长度和单调性是否合,然后计算每个区间的弯矩,再利用弯矩求解系数矩阵的线性方程组,最后对于每个区间,计算出其插值函数并拼接成整个函数。函数输出的 `x_out` 和 `y_out` 分别表示插值函数的横坐标和纵坐标,可以用来绘制插值曲线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荔枝科研社

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

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

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

打赏作者

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

抵扣说明:

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

余额充值