Matlab数值分析实例:三次样条插值

Matlab数值分析实例:三次样条插值

任务要求

湖水在夏天会出现分层现象,接近湖面温度较高,越往下温度变低。这种上热下冷的现象影响了水的对流和混合过程,使得下层水域缺氧,导致水生鱼类的死亡。如果把水温T看成深度x的函数T(x),有某个湖的观测数据如下:

T ( °C )22.822.822.820.613.911.711.111.1
x ( m )02.34.99.113.718.322.927.2

环境工程师希望:
1) 用三次样条插值(取合适的边界条件)求出T(x),并绘出其图形。
2) 求在什么深度处dT/dx的绝对值达到最大。

分析

题目要求使用三次样条插值。三次样条插值推导过程过于繁琐,在此不赘述,只简要提及其作用:

三次样条插值是指在两两数据点之间采用不超过三次的多项式函数将其连接,并且要求该函数二阶以下均可导的方法。

博主查阅了一些资料后,决定利用Matlab内置函数y=spline(x0,y0,x)实现(1)小问,其中y、x为变量,x0、y0为数据向量。取函数默认边界条件(非扭结边界条件)。

对于(2)小问,只需对(1)问求得的三次样条函数的导函数取步长遍历并记录坐标即可。

代码实现

clear all;clc
%导入数据向量
x0=[0	2.3   4.9   9.1   13.7   18.3   22.9   27.2];
y0=[22.8	22.8	22.8    20.6    13.9    11.7    11.1    11.1];
x=0:0.1:27.2;%取步长为0.1
y1=interp1(x0,y0,x);%分段线性插值
y2=spline(x0,y0,x);%三次样条插值
pp1=csape(x0,y0);
y3=ppval(pp1,x);
pp2=csape(x0,y0,'second');
y4=ppval(pp2,x);
[x',y1',y2',y3',y4']
subplot(1,2,1)
plot(x0,y0,'+',x,y1)
title('Piecewise linear')
subplot(1,2,2)
plot(x0,y0,'+',x,y2)
title('Spline1')
dx=diff(x);
dy=diff(y2);
dy_dx=dy./dx;
%寻找dy/dx的绝对值的最大值
N=length(dy_dx)
max=0
for i=1:N
if abs(dy_dx(i))>=max
max=abs(dy_dx(i));
absmax_position=i
end
end
disp('dT/dx的绝对值的最大值为')
max
disp('最大值对应x坐标为')
0.1*absmax_position
pp=spline(x0,y0)

总结

在(1)中,博主还额外画了一条分段线性插值的曲线对比,结果如下:
在这里插入图片描述
在(2)中,博主取步长0.1得到导函数的绝对值的最大值在11.4m处取得。

原文链接:https://blog.csdn.net/chandler_scut/article/details/106692827

  • 20
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值