【数学建模之Mathematica】4.插值

你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿

Wolfram语言与系统参考资料中心

详细资料见官方文档

插值与拟合在Mathematica中的操作也是相当方便(相对于Python而言),但是有个致命的缺点就是,当数据很大很多的时候,数据的导入、导出、使用令初学者并不是很舒服,一个很大的原因是因为对语言的不熟悉。我后面还会写的。

2、3是我在解决实际问题中的例子,同时还会对比插值阶数

目录

一、Interpolation        插值

1.基本范例:

(1)构建一个插值数据的近似函数

(2)应用函数,求插值

(3)绘制插值函数

(4)和原数据的比较

(5)即刻找出插值数值

 2.根据较少海底水深数据画出海底区域的地形和等高线图(二维散乱点插值)

(1)导入数据,插值,并选择内插阶数1,InterpolationOrder -> 1

(2)绘制三维图形,并选择黑色为轴

(3)绘制等高线图并显示标签与对标注

(4)导入数据,插值,并选择内插阶数All,InterpolationOrder -> All

(5)绘制三维图形,并选择黑色为轴

 (6)绘制等高线图并显示标签与对标注

 3.根据平面的高程数据表绘制三维表面图与等高线图(二维网格点插值)

(1)数据的导入

(2)插值,并选择内插阶数3

(3)绘制三维图

 (4)绘制等高线图


一、Interpolation        插值

基本用法:

 

二维、三维都可以插值,但是要注意格式

1.基本范例:

(1)构建一个插值数据的近似函数

f = Interpolation[{1, 2, 3, 5, 8, 5}]

(2)应用函数,求插值

f[2.5]

结果:2.4375

(3)绘制插值函数

Plot[f[x], {x, 1, 6}]

结果:

(4)和原数据的比较

Plot[f[x], {x, 1, 6}]; Show[%, ListPlot[{1, 2, 3, 5, 8, 5}]]

结果:

(5)即刻找出插值数值

Plot[f[x], {x, 1, 6}]; Show[%, ListPlot[{1, 2, 3, 5, 8, 5}]]

结果:2.4375

 2.根据较少海底水深数据画出海底区域的地形和等高线图(二维散乱点插值)

                                                                   海底水深数据

x129140103.588185.5195105157.5107.57781162162117.5
y7.5141.52314722.5137.585.5-6.5-81356.5-66.584-33.5
z48686889988949

(1)导入数据,插值,并选择内插阶数1,InterpolationOrder -> 1

(注:我这里把z都改为了负号,是因为海底的话理解为往下的高度)

fa = Interpolation[{{{129, 7.5}, -4}, {{140, 141.5}, -8}, {{103.5,
     23}, -6}, {{88, 147}, -8}, {{185.5, 22.5}, -6}, {{195,
     137.5}, -8}, {{105,
     85.5}, -8}, {{157.5, -6.5}, -9}, {{107.5, -81}, -9}, {{77,
     3}, -8}, {{81, 56.5}, -8}, {{162, -66.5}, -9}, {{162,
     84}, -4}, {{117.5, -33.5}, -9}}, InterpolationOrder -> 1]

(2)绘制三维图形,并选择黑色为轴

Plot3D[fa[x, y], {x, 80, 200}, {y, -70, 150}];

Show[%32, AxesStyle -> Black]

 结果:

(3)绘制等高线图并显示标签与对标注

ContourPlot[fa[x, y], {x, 80, 200}, {y, -70, 150},
 ContourLabels -> True, PlotLegends -> Automatic]

结果:

(4)导入数据,插值,并选择内插阶数All,InterpolationOrder -> All

 注意内插阶数不一定越高越好,只是在这里看上去效果比较平滑

fb = Interpolation[{{{129, 7.5}, -4}, {{140, 141.5}, -8}, {{103.5,
     23}, -6}, {{88, 147}, -8}, {{185.5, 22.5}, -6}, {{195,
     137.5}, -8}, {{105,
     85.5}, -8}, {{157.5, -6.5}, -9}, {{107.5, -81}, -9}, {{77,
     3}, -8}, {{81, 56.5}, -8}, {{162, -66.5}, -9}, {{162,
     84}, -4}, {{117.5, -33.5}, -9}}, InterpolationOrder -> All]

(5)绘制三维图形,并选择黑色为轴

Plot3D[fb[x, y], {x, 80, 200}, {y, -70, 150}];

Show[%37, AxesStyle -> Black]

结果:

 (6)绘制等高线图并显示标签与对标注

ContourPlot[fb[x, y], {x, 80, 200}, {y, -70, 150},
 ContourLabels -> True, PlotLegends -> Automatic]

 结果:

 可以根据图像与数据分析:由于数据点过少,因此一阶插值看起来效果并不好;但是对于All插值,虽然看起来平滑,但是当插值阶数达到很高时误差会更大,z全是负的,但是插值出来的结果却有正的,因此只能选择一阶插值

 3.根据平面的高程数据表绘制三维表面图与等高线图(二维网格点插值)

                                                                高程数据表

y\x010020030040050060070080090010001100120013001400
120013501370139014001410960940880800690570430290210150
110013701390141014301440114011101050950820690540380300210
1000138014101430145014701320128012001080940780620460370350
9001420143014501480150015501510143013001200980850750550500
800143014501460150015501600155016001600160015501500150015501550
7009501190137015001200110015501600155013801070900105011501200
6009101090127015001200110013501450120011501010880100010501100
50088010601230139015001500140090011001060950870900936950
40083098011801320145014204001300700900850810380780750
300740880108011301250128012301040900500700780750650550
200650760880970102010501020830800700300500550480350
100510620730800850870850780720650500200300350320
0370470550600670690670620580450400300100150250

(1)数据的导入

对于如此庞大数据,是不可能一个一个输入的,非常麻烦。关于数据的导入,我将在后几篇文章述说,这里就直接复制粘贴

dataInterp={{{0, 1200}, 1350}, {{100, 1200}, 1370}, {{200, 1200},
  1390}, {{300, 1200}, 1400}, {{400, 1200}, 1410}, {{500, 1200},
  960}, {{600, 1200}, 940}, {{700, 1200}, 880}, {{800, 1200},
  800}, {{900, 1200}, 690}, {{1000, 1200}, 570}, {{1100, 1200},
  430}, {{1200, 1200}, 290}, {{1300, 1200}, 210}, {{1400, 1200},
  150}, {{0, 1100}, 1370}, {{100, 1100}, 1390}, {{200, 1100},
  1410}, {{300, 1100}, 1430}, {{400, 1100}, 1440}, {{500, 1100},
  1140}, {{600, 1100}, 1110}, {{700, 1100}, 1050}, {{800, 1100},
  950}, {{900, 1100}, 820}, {{1000, 1100}, 690}, {{1100, 1100},
  540}, {{1200, 1100}, 380}, {{1300, 1100}, 300}, {{1400, 1100},
  210}, {{0, 1000}, 1380}, {{100, 1000}, 1410}, {{200, 1000},
  1430}, {{300, 1000}, 1450}, {{400, 1000}, 1470}, {{500, 1000},
  1320}, {{600, 1000}, 1280}, {{700, 1000}, 1200}, {{800, 1000},
  1080}, {{900, 1000}, 940}, {{1000, 1000}, 780}, {{1100, 1000},
  620}, {{1200, 1000}, 460}, {{1300, 1000}, 370}, {{1400, 1000},
  350}, {{0, 900}, 1420}, {{100, 900}, 1430}, {{200, 900},
  1450}, {{300, 900}, 1480}, {{400, 900}, 1500}, {{500, 900},
  1550}, {{600, 900}, 1510}, {{700, 900}, 1430}, {{800, 900},
  1300}, {{900, 900}, 1200}, {{1000, 900}, 980}, {{1100, 900},
  850}, {{1200, 900}, 750}, {{1300, 900}, 550}, {{1400, 900},
  500}, {{0, 800}, 1430}, {{100, 800}, 1450}, {{200, 800},
  1460}, {{300, 800}, 1500}, {{400, 800}, 1550}, {{500, 800},
  1600}, {{600, 800}, 1550}, {{700, 800}, 1600}, {{800, 800},
  1600}, {{900, 800}, 1600}, {{1000, 800}, 1550}, {{1100, 800},
  1500}, {{1200, 800}, 1500}, {{1300, 800}, 1550}, {{1400, 800},
  1550}, {{0, 700}, 950}, {{100, 700}, 1190}, {{200, 700},
  1370}, {{300, 700}, 1500}, {{400, 700}, 1200}, {{500, 700},
  1100}, {{600, 700}, 1550}, {{700, 700}, 1600}, {{800, 700},
  1550}, {{900, 700}, 1380}, {{1000, 700}, 1070}, {{1100, 700},
  900}, {{1200, 700}, 1050}, {{1300, 700}, 1150}, {{1400, 700},
  1200}, {{0, 600}, 910}, {{100, 600}, 1090}, {{200, 600},
  1270}, {{300, 600}, 1500}, {{400, 600}, 1200}, {{500, 600},
  1100}, {{600, 600}, 1350}, {{700, 600}, 1450}, {{800, 600},
  1200}, {{900, 600}, 1150}, {{1000, 600}, 1010}, {{1100, 600},
  880}, {{1200, 600}, 1000}, {{1300, 600}, 1050}, {{1400, 600},
  1100}, {{0, 500}, 880}, {{100, 500}, 1060}, {{200, 500},
  1230}, {{300, 500}, 1390}, {{400, 500}, 1500}, {{500, 500},
  1500}, {{600, 500}, 1400}, {{700, 500}, 900}, {{800, 500},
  1100}, {{900, 500}, 1060}, {{1000, 500}, 950}, {{1100, 500},
  870}, {{1200, 500}, 900}, {{1300, 500}, 936}, {{1400, 500},
  950}, {{0, 400}, 830}, {{100, 400}, 980}, {{200, 400},
  1180}, {{300, 400}, 1320}, {{400, 400}, 1450}, {{500, 400},
  1420}, {{600, 400}, 400}, {{700, 400}, 1300}, {{800, 400},
  700}, {{900, 400}, 900}, {{1000, 400}, 850}, {{1100, 400},
  810}, {{1200, 400}, 380}, {{1300, 400}, 780}, {{1400, 400},
  750}, {{0, 300}, 740}, {{100, 300}, 880}, {{200, 300},
  1080}, {{300, 300}, 1130}, {{400, 300}, 1250}, {{500, 300},
  1280}, {{600, 300}, 1230}, {{700, 300}, 1040}, {{800, 300},
  900}, {{900, 300}, 500}, {{1000, 300}, 700}, {{1100, 300},
  780}, {{1200, 300}, 750}, {{1300, 300}, 650}, {{1400, 300},
  550}, {{0, 200}, 650}, {{100, 200}, 760}, {{200, 200},
  880}, {{300, 200}, 970}, {{400, 200}, 1020}, {{500, 200},
  1050}, {{600, 200}, 1020}, {{700, 200}, 830}, {{800, 200},
  800}, {{900, 200}, 700}, {{1000, 200}, 300}, {{1100, 200},
  500}, {{1200, 200}, 550}, {{1300, 200}, 480}, {{1400, 200},
  350}, {{0, 100}, 510}, {{100, 100}, 620}, {{200, 100},
  730}, {{300, 100}, 800}, {{400, 100}, 850}, {{500, 100},
  870}, {{600, 100}, 850}, {{700, 100}, 780}, {{800, 100},
  720}, {{900, 100}, 650}, {{1000, 100}, 500}, {{1100, 100},
  200}, {{1200, 100}, 300}, {{1300, 100}, 350}, {{1400, 100},
  320}, {{0, 0}, 370}, {{100, 0}, 470}, {{200, 0}, 550}, {{300, 0},
  600}, {{400, 0}, 670}, {{500, 0}, 690}, {{600, 0}, 670}, {{700, 0},
  620}, {{800, 0}, 580}, {{900, 0}, 450}, {{1000, 0},
  400}, {{1100, 0}, 300}, {{1200, 0}, 100}, {{1300, 0},
  150}, {{1400, 0}, 250}}

(2)插值,并选择内插阶数3

f = Interpolation[dataInterp, InterpolationOrder -> 3]

(3)绘制三维图

Plot3D[f[x, y], {x, 0, 1400}, {y, 0, 1200}, AxesStyle -> Bold]

结果:

 

 (4)绘制等高线图

ContourPlot[f[x, y], {x, 0, 1400}, {y, 0, 1200},
 ContourLabels -> True, PlotLegends -> Automatic]

结果:

你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

若oo尘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值