/ /テイラー多項式計算 - python、数学

テイラー多項式計算 - Python、数学

私は現在、私の大学での研究のためにpythonの練習をしています。私はこの仕事に非常に立ち往生しています。

指数関数e ^ xに対する次数Nのテイラー多項式は、次式で与えられます。

        N
p(x) = Sigma  x^k/k!
k = 0

(i)クラスPolynomialをインポートするプログラムを作る(下)、(ii)コマンドラインからxと一連のN値を読み取る、(iii)テイラー多項式を表す多項式インスタンスを作成する、(iv)与えられたN値に対するp(x)の値を出力する正確な値e ^ xと同様に。 x = 0.5、3、10とN = 2、5、10、15、25でプログラムを試してみてください。

Polynomial.py

import numpy

class Polynomial:
def __init__(self, coefficients):
self.coeff = coefficients

def __call__(self, x):
"""Evaluate the polynomial."""
s = 0
for i in range(len(self.coeff)):
s += self.coeff[i]*x**i
return s

def __add__(self, other):
# Start with the longest list and add in the other
if len(self.coeff) > len(other.coeff):
result_coeff = self.coeff[:]  # copy!
for i in range(len(other.coeff)):
result_coeff[i] += other.coeff[i]
else:
result_coeff = other.coeff[:] # copy!
for i in range(len(self.coeff)):
result_coeff[i] += self.coeff[i]
return Polynomial(result_coeff)

def __mul__(self, other):
c = self.coeff
d = other.coeff
M = len(c) - 1
N = len(d) - 1
result_coeff = numpy.zeros(M+N+1)
for i in range(0, M+1):
for j in range(0, N+1):
result_coeff[i+j] += c[i]*d[j]
return Polynomial(result_coeff)

def differentiate(self):
"""Differentiate this polynomial in-place."""
for i in range(1, len(self.coeff)):
self.coeff[i-1] = i*self.coeff[i]
del self.coeff[-1]

def derivative(self):
"""Copy this polynomial and return its derivative."""
dpdx = Polynomial(self.coeff[:])  # make a copy
dpdx.differentiate()
return dpdx

def __str__(self):
s = ""
for i in range(0, len(self.coeff)):
if self.coeff[i] != 0:
s += " + %g*x^%d" % (self.coeff[i], i)
# Fix layout
s = s.replace("+ -", "- ")
s = s.replace("x^0", "1")
s = s.replace(" 1*", " ")
s = s.replace("x^1 ", "x ")
#s = s.replace("x^1", "x") # will replace x^100 by x^00
if s[0:3] == " + ":  # remove initial +
s = s[3:]
if s[0:3] == " - ":  # fix spaces for initial -
s = "-" + s[3:]
return s

def simplestr(self):
s = ""
for i in range(0, len(self.coeff)):
s += " + %g*x^%d" % (self.coeff[i], i)
return s


def _test():
p1 = Polynomial([1, -1])
p2 = Polynomial([0, 1, 0, 0, -6, -1])
p3 = p1 + p2
print p1, "  +  ", p2, "  =  ", p3
p4 = p1*p2
print p1, "  *  ", p2, "  =  ", p4
print "p2(3) =", p2(3)
p5 = p2.derivative()
print "d/dx", p2, "  =  ", p5
print "d/dx", p2,
p2.differentiate()
print "  =  ", p5
p4 = p2.derivative()
print "d/dx", p2, "  =  ", p4

if __name__ == "__main__":
_test()

今、私は本当にこれに立ち往生しています。説明を受ける!私は自分のコードを別のファイルに書くことになっています。多項式クラスのインスタンスを作成し、そのリストをargv [2:]で送信することを考えていますが、うまくいきません。多項式クラスに送る前に、Nの異なる値に対してテイラー多項式を計算するためのdefを作らなければなりませんか?

どんな助けでも素晴らしいです、前もってありがとう:)

回答:

回答№1は2

完全に終わったわけではありませんが、これは私が信じるあなたの主な質問に答えます。クラスPolynomialをpoly.pに入れてインポ​​ートします。

from poly import Polynomial as p
from math import exp,factorial

def get_input(n):
""" get n numbers from stdin """
entered = list()
for i in range(n):
print "input number "
entered.append(raw_input())
return entered

def some_input():
return [[2,3,4],[4,3,2]]



get input from cmd line
n = 3
a = get_input(n)
b = get_input(n)


#a,b = some_input()

ap = p(a)
bp = p(b)


print "entered : ",a,b

c = ap+bp

print "a + b = ",c

print exp(3)

x = ap
print x

sum = p([0])
for k in range(1,5):
el = x
for j in range(1,k):
el  el * x
print "el: ",el
if el!=None and sum!=None:
sum = sum + el
print "sum ",sum

出力

entered :  [2, 3, 4] [4, 3, 2]
a + b =  6*1 + 6*x + 6*x^2
20.0855369232
2*1 + 3*x + 4*x^2
sum  2*1 + 3*x + 4*x^2
el:  4*1 + 12*x + 25*x^2 + 24*x^3 + 16*x^4
sum  6*1 + 15*x + 29*x^2 + 24*x^3 + 16*x^4
el:  4*1 + 12*x + 25*x^2 + 24*x^3 + 16*x^4
el:  8*1 + 36*x + 102*x^2 + 171*x^3 + 204*x^4 + 144*x^5 + 64*x^6
sum  14*1 + 51*x + 131*x^2 + 195*x^3 + 220*x^4 + 144*x^5 + 64*x^6
el:  4*1 + 12*x + 25*x^2 + 24*x^3 + 16*x^4
el:  8*1 + 36*x + 102*x^2 + 171*x^3 + 204*x^4 + 144*x^5 + 64*x^6
el:  16*1 + 96*x + 344*x^2 + 792*x^3 + 1329*x^4 + 1584*x^5 + 1376*x^6 + 768*x^7 + 256*x^8
sum  30*1 + 147*x + 475*x^2 + 987*x^3 + 1549*x^4 + 1728*x^5 + 1440*x^6 + 768*x^7 + 256*x^8

回答№2の場合は1

質問(iv)に答えるかどうかは定かではないが、私は次のようにして課題を解決した。 出力は、e ** xの正確な値をモジュールPolynomialからの計算値と比較するだけです。

from math import factorial, exp
from Polynomial import *
from sys import *

#Reads x and N from the command line on the form [filename.py, x-value, N-value]
x = eval(argv[1])
N = eval(argv[2])

#Creating list of coefficients on the form [1 / i!]
list_coeff = [1./factorial(i) for i in range(N)]

print list_coeff

#Creating an instance of class Polynomial
p1 = Polynomial(list_coeff)

print "Calculated value of e**%f = %f " %(x, p1.__call__(x))
print "Exact value of e**%f = %f"% (x, exp(x))

"""Test Execution
Terminal > python Polynomial_exp.py 0.5 5
[1.0, 1.0, 0.5, 0.16666666666666666, 0.041666666666666664]
Calculated value of e**0.500000 = 1.648438
Exact value of e**0.500000 = 1.648721
"""