
本文介绍了如何使用 scipy.interpolate 库中的 RBFInterpolator 类进行二维样条插值,并实现超出原始数据范围的外推。通过示例代码演示了如何利用该方法创建插值函数,并将其应用于原始数据范围之外的点,从而得到外推值。
scipy.interpolate 库提供了多种插值方法,其中 RBFInterpolator 是一种强大的工具,尤其适用于处理散乱数据。与 griddata 相比,RBFInterpolator 更直接地使用径向基函数进行插值,并且能够方便地进行外推。
使用 RBFInterpolator 进行二维插值和外推的步骤如下:
导入必要的库:
import ioimport numpy as npimport pandas as pdfrom scipy.interpolate import RBFInterpolatorfrom numpy import maimport matplotlib.pyplot as plt
准备数据:
首先,需要准备包含自变量 (x, y) 和因变量 z 的数据。在这个例子中,数据是从一个 CSV 文件读取的。
data_str = """dte,4350,4400,4450,4500,4550,4600,4650,4700,4750,4800,4850,4900,4950,5000,5050,5100,5150,5200,5250,53000.01369863,0.19589,0.17243,0.15383,0.13883,0.12662,0.11658,0.10826,0.10134,0.09556,0.09071,0.0866,0.08308,0.08004,0.07738,0.07504,0.07296,0.07109,0.06939,0.067850.02191781,0.19463,0.17149,0.15314,0.13836,0.12632,0.11644,0.10826,0.10148,0.09582,0.09099,0.08688,0.08335,0.08029,0.0776,0.07523,0.07312,0.07122,0.06949,0.067920.03013699,0.1935,0.17066,0.15253,0.13794,0.12604,0.11627,0.10819,0.1015,0.0959,0.09112,0.08704,0.0835,0.08042,0.0777,0.0753,0.07316,0.07123,0.06947,0.067870.04109589,0.19149,0.16901,0.15123,0.13691,0.1253,0.11576,0.10786,0.10132,0.09584,0.09117,0.08717,0.08368,0.08058,0.07783,0.07539,0.07321,0.07124,0.06945,0.067810.06849315,0.18683,0.16511,0.14808,0.13434,0.12324,0.1141,0.10655,0.10033,0.09513,0.09067,0.08686,0.08352,0.08055,0.07795,0.07565,0.07359,0.07173,0.07002,0.068480.09589041,0.18271,0.16178,0.14538,0.13211,0.12136,0.1125,0.10518,0.09918,0.09416,0.08984,0.08615,0.08292,0.08006,0.07755,0.07536,0.0734,0.07163,0.06999,0.068530.12328767,0.17929,0.15892,0.14297,0.12999,0.1195,0.11085,0.10371,0.09788,0.09301,0.0888,0.08521,0.08207,0.07929,0.07685,0.07474,0.07285,0.07114,0.06956,0.068160.15068493,0.17643,0.15643,0.14084,0.12809,0.11778,0.10929,0.10229,0.09658,0.0918,0.08767,0.08416,0.08109,0.07838,0.07599,0.07394,0.0721,0.07043,0.0689,0.067540.17808219,0.17401,0.15429,0.13896,0.12642,0.11629,0.10795,0.10107,0.09547,0.09077,0.08671,0.08326,0.08025,0.0776,0.07526,0.07326,0.07146,0.06983,0.06833,0.0670.20547945,0.17195,0.15238,0.13719,0.12484,0.11487,0.10666,0.09989,0.09439,0.08977,0.08578,0.08238,0.07942,0.07681,0.07451,0.07255,0.07078,0.06918,0.06772,0.06640.23287671,0.17014,0.15069,0.13557,0.12339,0.11356,0.10547,0.0988,0.09339,0.08885,0.08492,0.08157,0.07865,0.07608,0.07382,0.07188,0.07014,0.06856,0.06712,0.065820.26027397,0.16854,0.14918,0.13414,0.1221,0.1124,0.10442,0.09785,0.09253,0.08806,0.08418,0.08087,0.07798,0.07544,0.0732,0.07128,0.06956,0.068,0.06657,0.065280.28767123,0.16713,0.14784,0.13286,0.12094,0.11136,0.10348,0.09699,0.09175,0.08735,0.08352,0.08025,0.0774,0.07488,0.07266,0.07075,0.06904,0.06749,0.06607,0.06480.31506849,0.16587,0.14664,0.13173,0.11994,0.11046,0.10268,0.09627,0.0911,0.08676,0.08297,0.07973,0.07691,0.07441,0.0722,0.0703,0.06861,0.06707,0.06566,0.06440.34246575,0.16475,0.14557,0.13073,0.11905,0.10967,0.10198,0.09564,0.09053,0.08624,0.08249,0.07928,0.07648,0.074,0.0718,0.06991,0.06823,0.0667,0.0653,0.064050.36986301,0.16375,0.14462,0.12985,0.11827,0.10897,0.10136,0.09509,0.09003,0.08578,0.08207,0.07888,0.0761,0.07364,0.07145,0.06957,0.0679,0.06638,0.06499,0.063750.39726027,0.16284,0.14377,0.12907,0.11757,0.10835,0.10081,0.0946,0.08959,0.08537,0.08169,0.07852,0.07576,0.07331,0.07114,0.06927,0.06761,0.0661,0.06472,0.063490.42465753,0.16203,0.14299,0.12837,0.11695,0.1078,0.10033,0.09417,0.08921,0.08502,0.08136,0.07821,0.07547,0.07303,0.07087,0.06901,0.06736,0.06586,0.06448,0.063250.45205479,0.16129,0.14228,0.12773,0.11638,0.10731,0.09989,0.09378,0.08886,0.08469,0.08105,0.07792,0.07519,0.07276,0.07061,0.06876,0.06712,0.06562,0.06425,0.06303"""vol = pd.read_csv(io.StringIO(data_str))vol.set_index('dte',inplace=True)valid_vol=ma.masked_invalid(vol).TTi=np.linspace(float((vol.index).min()),float((vol.index).max()),len(vol.index))Ki=np.linspace(float((vol.columns).min()),float((vol.columns).max()),len(vol.columns))Ti,Ki = np.meshgrid(Ti,Ki)valid_Ti = Ti[~valid_vol.mask]valid_Ki = Ki[~valid_vol.mask]valid_vol = valid_vol[~valid_vol.mask]points = np.column_stack((valid_Ti.ravel(), valid_Ki.ravel()))values = valid_vol.ravel()
创建 RBFInterpolator 对象:
使用 RBFInterpolator 类创建一个插值对象。需要传入自变量和因变量的数据。 smoothing 参数可以调整插值的平滑程度。
rbf = RBFInterpolator(points, values, smoothing=0)
进行插值和外推:
使用创建的 RBFInterpolator 对象进行插值和外推。 可以传入任意的 (x, y) 坐标,包括原始数据范围之外的坐标。
# 在原始数据范围内插值interp_value = rbf(np.array([0.015, 4545]))print(f"Interpolated value at (0.015, 4545): {interp_value}")# 在原始数据范围外外推extrapolated_value = rbf(np.array([0, 4500]))print(f"Extrapolated value at (0, 4500): {extrapolated_value}")
可视化结果(可选):
可以使用 matplotlib 库将插值结果可视化,以便更直观地了解插值效果。
fig = plt.figure()ax = fig.add_subplot(111, projection='3d')x = np.linspace(Ti.min(),Ti.max(),100)y = np.linspace(Ki.min(),Ki.max(),100)x,y=np.meshgrid(x,y)z = rbf(np.column_stack((x.ravel(), y.ravel()))).reshape(x.shape)ax.plot_surface(x, y, z, cmap='viridis')plt.show()
完整代码示例:
import ioimport numpy as npimport pandas as pdfrom scipy.interpolate import RBFInterpolatorfrom numpy import maimport matplotlib.pyplot as pltdata_str = """dte,4350,4400,4450,4500,4550,4600,4650,4700,4750,4800,4850,4900,4950,5000,5050,5100,5150,5200,5250,53000.01369863,0.19589,0.17243,0.15383,0.13883,0.12662,0.11658,0.10826,0.10134,0.09556,0.09071,0.0866,0.08308,0.08004,0.07738,0.07504,0.07296,0.07109,0.06939,0.067850.02191781,0.19463,0.17149,0.15314,0.13836,0.12632,0.11644,0.10826,0.10148,0.09582,0.09099,0.08688,0.08335,0.08029,0.0776,0.07523,0.07312,0.07122,0.06949,0.067920.03013699,0.1935,0.17066,0.15253,0.13794,0.12604,0.11627,0.10819,0.1015,0.0959,0.09112,0.08704,0.0835,0.08042,0.0777,0.0753,0.07316,0.07123,0.06947,0.067870.04109589,0.19149,0.16901,0.15123,0.13691,0.1253,0.11576,0.10786,0.10132,0.09584,0.09117,0.08717,0.08368,0.08058,0.07783,0.07539,0.07321,0.07124,0.06945,0.067810.06849315,0.18683,0.16511,0.14808,0.13434,0.12324,0.1141,0.10655,0.10033,0.09513,0.09067,0.08686,0.08352,0.08055,0.07795,0.07565,0.07359,0.07173,0.07002,0.068480.09589041,0.18271,0.16178,0.14538,0.13211,0.12136,0.1125,0.10518,0.09918,0.09416,0.08984,0.08615,0.08292,0.08006,0.07755,0.07536,0.0734,0.07163,0.06999,0.068530.12328767,0.17929,0.15892,0.14297,0.12999,0.1195,0.11085,0.10371,0.09788,0.09301,0.0888,0.08521,0.08207,0.07929,0.07685,0.07474,0.07285,0.07114,0.06956,0.068160.15068493,0.17643,0.15643,0.14084,0.12809,0.11778,0.10929,0.10229,0.09658,0.0918,0.08767,0.08416,0.08109,0.07838,0.07599,0.07394,0.0721,0.07043,0.0689,0.067540.17808219,0.17401,0.15429,0.13896,0.12642,0.11629,0.10795,0.10107,0.09547,0.09077,0.08671,0.08326,0.08025,0.0776,0.07526,0.07326,0.07146,0.06983,0.06833,0.0670.20547945,0.17195,0.15238,0.13719,0.12484,0.11487,0.10666,0.09989,0.09439,0.08977,0.08578,0.08238,0.07942,0.07681,0.07451,0.07255,0.07078,0.06918,0.06772,0.06640.23287671,0.17014,0.15069,0.13557,0.12339,0.11356,0.10547,0.0988,0.09339,0.
以上就是使用 RBFInterpolator 进行二维样条插值并外推的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373915.html
微信扫一扫
支付宝扫一扫