2017-06-10 129 views
1

次のコードは、単一の値xと点のリストXをとり、指定された点のリストを介してラグランジュ多項式の値を決定しますx値。例えばラグランジュ補間のためのPythonコード - 多項式の方程式を決定する

def chunkIt(seq, num): 
    avg = len(seq)/float(num) 
    out = [] 
    last = 0.0 
    while last < len(seq): 
     out.append(seq[int(last):int(last + avg)]) 
     last += avg 
    return out 

def product(list): 
    p = 1 
    for i in list: 
     p *= i 
    return p 

def Lagrange(x,X): 
    T = np.zeros((2,len(X))) 
    list = [] 
    for i in range(len(X)): 
     for j in range(len(X)): 
      if i != j: 
       list.append((x-X[j][0])/(X[i][0]-X[j][0])) 
    p = [] 
    for i in chunkIt(list,len(X)): 
     p.append(product(i)) 
    for i in range(len(X)): 
     T[0][i] = p[i] 
     T[1][i] = X[i][1] 

    list2 = [] 
    for i in range(len(X)): 
     list2.append(T[0][i]*T[1][i]) 
    return sum(list2) 

x, X = 3, [[0,0],[1,1],[2,0.5]] 

は-1.5の値を与えます。

ポイントのリストから多項式の方程式を決定するには、このコードを変更するにはどうすればよいですか?すなわち、Iは、入力としてx = 'x'を置けば、それはこれが得られたラグランジュ多項式の次数である

+0

多分これが開始する場所のとおりです。http://www.sympy .org / –

答えて

2
import numpy as np 
from pypoly import Polynomial 

x, X = 3, [[0, 0], [1, 1], [2, 0.5]] 

order = len(X) 

【所与たとえば] -0.75x**2 + 1.75xを返したいです。あなたの例では、注文は3です。

これは、ポイントを一般多項式に代入することによって連立方程式を設定します。順序3のために、一般的な多項式である:

* X ** 2 + B * X ** 1 + C * X ** 0 = Y

これは解決します連立方程式の系で係数を求める。注文3では、a、b、cの値が得られます。ここ

print 'coefficients', list(coefficients) 

係数[0.0、1.75、-0.75]

p = Polynomial(*coefficients) 

、*演算子は通過する個々の値にアレイ状の要素を分割Polynomial()の引数として使用します。

print p 

1.75 * X - 0.75 * X ** 2

print p(x) 

-1.5

Pythonの2のために

:PIP、使用してPyPolynomialをインストールするには

のPython 3用
pip install PyPolynomial 

pip3 install PyPolynomial