你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿
详细资料见官方文档
插值与拟合在Mathematica中的操作也是相当方便(相对于Python而言),但是有个致命的缺点就是,当数据很大很多的时候,数据的导入、导出、使用令初学者并不是很舒服,一个很大的原因是因为对语言的不熟悉。我后面还会写的。
2、3是我在解决实际问题中的例子,同时还会对比插值阶数
目录
2.根据较少海底水深数据画出海底区域的地形和等高线图(二维散乱点插值)
(1)导入数据,插值,并选择内插阶数1,InterpolationOrder -> 1
(4)导入数据,插值,并选择内插阶数All,InterpolationOrder -> All
3.根据平面的高程数据表绘制三维表面图与等高线图(二维网格点插值)
一、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.根据较少海底水深数据画出海底区域的地形和等高线图(二维散乱点插值)
海底水深数据
x | 129 | 140 | 103.5 | 88 | 185.5 | 195 | 105 | 157.5 | 107.5 | 77 | 81 | 162 | 162 | 117.5 |
y | 7.5 | 141.5 | 23 | 147 | 22.5 | 137.5 | 85.5 | -6.5 | -81 | 3 | 56.5 | -66.5 | 84 | -33.5 |
z | 4 | 8 | 6 | 8 | 6 | 8 | 8 | 9 | 9 | 8 | 8 | 9 | 4 | 9 |
(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\x | 0 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 1000 | 1100 | 1200 | 1300 | 1400 |
1200 | 1350 | 1370 | 1390 | 1400 | 1410 | 960 | 940 | 880 | 800 | 690 | 570 | 430 | 290 | 210 | 150 |
1100 | 1370 | 1390 | 1410 | 1430 | 1440 | 1140 | 1110 | 1050 | 950 | 820 | 690 | 540 | 380 | 300 | 210 |
1000 | 1380 | 1410 | 1430 | 1450 | 1470 | 1320 | 1280 | 1200 | 1080 | 940 | 780 | 620 | 460 | 370 | 350 |
900 | 1420 | 1430 | 1450 | 1480 | 1500 | 1550 | 1510 | 1430 | 1300 | 1200 | 980 | 850 | 750 | 550 | 500 |
800 | 1430 | 1450 | 1460 | 1500 | 1550 | 1600 | 1550 | 1600 | 1600 | 1600 | 1550 | 1500 | 1500 | 1550 | 1550 |
700 | 950 | 1190 | 1370 | 1500 | 1200 | 1100 | 1550 | 1600 | 1550 | 1380 | 1070 | 900 | 1050 | 1150 | 1200 |
600 | 910 | 1090 | 1270 | 1500 | 1200 | 1100 | 1350 | 1450 | 1200 | 1150 | 1010 | 880 | 1000 | 1050 | 1100 |
500 | 880 | 1060 | 1230 | 1390 | 1500 | 1500 | 1400 | 900 | 1100 | 1060 | 950 | 870 | 900 | 936 | 950 |
400 | 830 | 980 | 1180 | 1320 | 1450 | 1420 | 400 | 1300 | 700 | 900 | 850 | 810 | 380 | 780 | 750 |
300 | 740 | 880 | 1080 | 1130 | 1250 | 1280 | 1230 | 1040 | 900 | 500 | 700 | 780 | 750 | 650 | 550 |
200 | 650 | 760 | 880 | 970 | 1020 | 1050 | 1020 | 830 | 800 | 700 | 300 | 500 | 550 | 480 | 350 |
100 | 510 | 620 | 730 | 800 | 850 | 870 | 850 | 780 | 720 | 650 | 500 | 200 | 300 | 350 | 320 |
0 | 370 | 470 | 550 | 600 | 670 | 690 | 670 | 620 | 580 | 450 | 400 | 300 | 100 | 150 | 250 |
(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]
结果:
你们的每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿