ich bin gerade am Programmieren eines Interpolationspolynoms nach Newton.
Mein Code funktioniert für die auskommentierten Werte in der Main-Methode. Jedoch leider nicht für die Werte, die ich versuche über eine Excel-Liste reinzugeben. Ich erhalte zwar den Graphen der Werte aus der Excel-Liste, aber nicht das Interpolationspolynom an den Stützstellen. Außerdem bekomme ich folgende Fehlermeldung:
e:/Dorothea/Python Skripte/test2.py:34: RuntimeWarning: overflow encountered in double_scalars
counter = counter * (X - X[k-1])
e:/Dorothea/Python Skripte/test2.py:75: RuntimeWarning: invalid value encountered in double_scalars
C = (Y - sum) / A
e:/Dorothea/Python Skripte/test2.py:74: RuntimeWarning: invalid value encountered in double_scalars
sum = sum + A[j] * C[j]
Mein Code lautet folgendermaßen:
import pandas as pd
import numpy as np
import numpy.linalg
import matplotlib.pyplot as plt
#Datensatz importieren
dataset = pd.read_excel('E:\Maus1_gesund.xlsx')
values = dataset.values
valuesX = np.zeros(len(values))
for i in range(len(values)):
valuesX = values[0]
valuesY = np.zeros(len(values))
for j in range(len(values)):
valuesY[j] = values[j][1]
#print(valuesY[:])
def newton_matrix(X):
# """Setup the matrix of the LSE which is used to determine the coefficients
# of the Newton-basis. X are the x-coordinates of the nodes which are
# used for interpolation."""
# Matrix zweidimensional mit Nullen fuellen und 1. Spalte mit 1
result = np.zeros((len(X), len(X)))
for a in range(0, len(result)):
result[a][0] = 1
# zeilenmaessiges Befuellen der Matrix mit den entsprechenden Polynomen
for i in range(1, len(result)):
for j in range(1, i+1):
counter = 1
for k in range(1, j+1):
counter = counter * (X - X[k-1])
result[j] = counter
return result
def newton_polynomial(C, X):
# """Take coefficients and interpolation point x-coordinates of the
# Newton-polynomial and determine the corresponding interpolation polynomial."""
# Bedingung muss erfuellt sein, ansonsten Abbruch der Methode
assert len(C) == len(X)
# Anlegen des Newton-Polynom; Methode poly1d erstellt ein Polynom mithilfe von True gibt er die faktorisierte
# Form an
result = np.poly1d([])
# Erstellen des Interpolationspolynoms nach Newton; np.poly1d gibt fuer eine leere Liste 1 heraus
for i in range(0, len(C)):
X_new = []
for j in range(0, i):
X_new.append(X[j])
X_poly = np.poly1d(X_new, True)
result = result + C[i] * X_poly
return result
def interpolating_polynomial(X,Y):
#"""Determine the interpolating polynomial for the given NumPy arrays of x and y coordinates."""
# Pruefen, ob Bedingung erfuellt wird, ansonsten Abbruch der Methode
assert len(X) == len(Y)
# Erstellen der Matrix A
A = newton_matrix(X)
# Erstellen des Vektors C
C = np.zeros(len(A))
# Koeffizienten des Newton-Polynoms bestimmen und als Polynom darstellen
for i in range(len(A)):
sum = 0
for j in range(len(A)):
sum = sum + A[i][j] * C[j]
C[i] = (Y[i] - sum) / A[i][i]
result = newton_polynomial(C, X)
return result
def interpolation_plot(X,Y):
p = interpolating_polynomial(X, Y)
px = np.arange(min(X)-0.1, max(X)+0.11, 0.01)
plt.grid(True)
plt.plot(X, Y, "o")
plt.plot(px, p(px))
plt.show()
def main():
# newton_matrix(np.array([-2., 0., 2.]))
# X = np.array([0, 1, 2,3])
# Y = np.array([-2.,3.,1.,2.])
X = valuesX
Y = valuesY
interpolation_plot(X, Y)
if __name__ == "__main__": main()
Meine Werte in der Excel-Liste besteht aus 215 x und y-Werten
Hat jemand eine Idee?
Vielen Dank schonmal.
