需要在Python中绘制分段线性插值代码的帮助吗

需要在Python中绘制分段线性插值代码的帮助吗,python,numpy,matplotlib,interpolation,linear-algebra,Python,Numpy,Matplotlib,Interpolation,Linear Algebra,我正在尝试我的手插值数据使用一个简单的线性函数,拉格朗日插值多项式。我已经设法得到了所需的方程式,但是,我无法找出如何分段绘制。我知道使用symphy并不是最好的方法,但我是一个noob,我想看看我的方程是什么样子 如何使其在matplotlib中绘图,而无需在末尾手动键入方程式 import numpy as np import matplotlib.pyplot as plt import sympy as sym x = sym.Symbol('x') year = np.arange

我正在尝试我的手插值数据使用一个简单的线性函数,拉格朗日插值多项式。我已经设法得到了所需的方程式,但是,我无法找出如何分段绘制。我知道使用symphy并不是最好的方法,但我是一个noob,我想看看我的方程是什么样子

如何使其在matplotlib中绘图,而无需在末尾手动键入方程式

import numpy as np
import matplotlib.pyplot as plt
import sympy as sym

x = sym.Symbol('x')

year = np.arange(1960,2020,10)
pop = [179323,203302,226542,249633,281422,308746]

def lgn(a,b): #this ideally should be taking a value of x where you'd like to interpolate.
    result = []
    for i in range(1,len(a)):
        L0 = (x - a[i])/(a[i-1] - a[i])
        L1 = (x - a[i-1])/(a[i] - a[i-1])
        temp = (L0 * b[i-1]) + (L1 * b[i])
        result.append(temp)
    return result

lgn(year,pop) #result gives a list of linear equations between each year value. 

[23979*x/10 - 4520561,
 2324*x - 4374978,
 23091*x/10 - 4345476,
 31789*x/10 - 6076378,
 13662*x/5 - 5183378]

#plotting for each interval. this is what I am trying to code.  
x1 = np.linspace(year[0],year[1],10)
y1 = 23979 * x1/10 - 4520561

x2 = np.linspace(year[1],year[2],10)
y2 = 2324*x2 - 4374978

x3 = np.linspace(year[2],year[3],10)
y3 = 23091*x3/10 - 4345476

x4 = np.linspace(year[3],year[4],10)
y4 = 31789*x4/10 - 6076378

x5 = np.linspace(year[4],year[5],10)
y5 = 13662*x5/5 - 5183378

plt.plot(year,pop,'ro',x1,y1,x2,y2,x3,y3,x4,y4,x5,y5 )

使用
expr.subs(x,123).evalf()
将sympy表达式转换为数值。请注意,这仅适用于替换单个值。要使用数组,
sym.lambdify()
可以将表达式转换为理解numpy数组的函数,然后可以用于打印

下面是一些示例代码:

将numpy导入为np
将matplotlib.pyplot作为plt导入
将sympy作为sym导入
def lgn(a、b):
结果=[]
对于范围(1,len(a))中的i:
L0=(x-a[i])/(a[i-1]-a[i])
L1=(x-a[i-1])/(a[i]-a[i-1])
温度=(L0*b[i-1])+(L1*b[i])
结果追加(临时)
返回结果
x=符号('x')
年份=np.arange(1960、2020、10)
pop=[17932320330222654249633281422308746]
方程式=lgn(年份,pop)
对于范围(1,len(年))内的i:
席=NP.LimSales(年[I - 1 ],年[I],10)
yi_np=sym.lambdify(x,方程[i-1])
yi=yi_np(xi)
plt.地块(xi,yi)
plt.plot(年份、pop和ro)
plt.show()

以下是使用sympy的分段
方法:

将numpy导入为np
将matplotlib.pyplot作为plt导入
将sympy作为sym导入
def管路2点(a0、b0、a1、b1):
L0=(x-a1)/(a0-a1)
L1=(x-a0)/(a1-a0)
返回L0*b0+L1*b1
x=符号('x')
年份=np.arange(1960、2020、10)
pop=[17932320330222654249633281422308746]
等式=0
对于范围(1,len(年))内的i:

eq=sym.分段((line_2points(year[i-1],pop[i-1],year[i],pop[i]),(x>=year[i-1])&(x,谢谢。我知道sympy现在可能是最好的方法,在这种情况下,还有什么其他可能的解决方案?您认为此绘图代码也适用于二次/三次样条函数吗?请参阅[使用Symphy通过给定点构造符号插值样条曲线]()关于使用Symphy构造插值样条曲线的方法。您可以像这里一样对此类样条曲线进行lambdify。谢谢,这非常有用。