任务要求
湖水在夏天会出现分层现象,接近湖面温度较高,越往下温度变低。这种上热下冷的现象影响了水的对流和混合过程,使得下层水域缺氧,导致水生鱼类的死亡。如果把水温T看成深度x的函数T(x),有某个湖的观测数据如下:
T ( °C ) | 22.8 | 22.8 | 22.8 | 20.6 | 13.9 | 11.7 | 11.1 | 11.1 |
---|---|---|---|---|---|---|---|---|
x ( m ) | 0 | 2.3 | 4.9 | 9.1 | 13.7 | 18.3 | 22.9 | 27.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