线性插值的代码python_如何实现线性插值?

更新时间:2023-05-12 00:30:15 阅读: 评论:0

线性插值的代码python_如何实现线性插值?
我想出了⼀个相当优雅的解决⽅案(IMHO),所以我忍不住贴了出来:from bict import bict_left
class Interpolate(object):
def __init__(lf, x_list, y_list):
if any(y - x <= 0 for x, y in zip(x_list, x_list[1:])):
rai ValueError("x_list must be in strictly ascending order!")
x_list = lf.x_list = map(float, x_list)
y_list = lf.y_list = map(float, y_list)
intervals = zip(x_list, x_list[1:], y_list, y_list[1:])
lf.slopes = [(y2 - y1)/(x2 - x1) for x1, x2, y1, y2 in intervals]
def __getitem__(lf, x):
i = bict_left(lf.x_list, x) - 1
return lf.y_list[i] + lf.slopes[i] * (x - lf.x_list[i])
我映射到float,这样,如果x1、x2、y1和y2都是某些iterval的整数,整数除法(python<;=2.7)就不会启动并破坏事物。
在__getitem__中,我利⽤lf.x_列表是按升序排序的这⼀事实,使⽤bict_left来(⾮常)快速地找到lf.x_list中⼩于x的最⼤元素的索引。
使⽤这样的类:i = Interpolate([1, 2.5, 3.4, 5.8, 6], [2, 4, 5.8, 4.3, 4])
# Get the interpolated value at x = 4:
y = i[4]
为了简单起见,我根本没有处理过边界条件。事实上,i[x]的x < 1将⼯作,就好像从(2.5,4)到(1,2)的线被扩展到了负⽆穷⼤,⽽x == 1或x > 6的i[x]将产⽣IndexError。最好是在所有情况下都提出索引器错误,但这留给读者作为练习。:)

本文发布于:2023-05-12 00:30:15,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/885513.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:排序   留给   整数   读者   练习   提出
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图