• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Interpolacja wielomianowa Python

42 Warsaw Coding Academy
0 głosów
2,078 wizyt
pytanie zadane 5 grudnia 2020 w Python przez urbanski-paw Nowicjusz (140 p.)
zamknięte 29 kwietnia 2021 przez urbanski-paw

Witam, potrzebuję napisać kod który dopasuje funkcje do punktów pomiarowych x=[1, 2, 3], y=[1, 3, 8]. Funkcja ta ma być wielomianem potęgowym tj. y=a0+a1*x++a2*x^2+...  Potrzebuję wiec wyznaczyć wartości współczynników a. Napisałem poniższy kod:

import numpy as np
import sympy as sp
from scipy import linalg
import matplotlib.pylab as plt
def f(x,a):
    return a[0]+x*a[1]+(a[2])*x**2

x=sp.Symbol('x')
a=sp.Symbol('a')

x=np.array([1, 2, 3])
y=np.array([1, 3, 8])
a=[]
a=linalg.solve(x,y)
print(a)
z=y+0
for i in range(0,2):
    z[i]=f(x[i],a)
plt.plot(x,y,"ro",ms=10)
plt.plot(x,z,lw=2)
plt.xlim(0,4)
plt.show()

Problem polega na tym że, linalg.solve wyznacza te współczynniki tylko dla macierzy kwadratowej. Zrobienie z x macierzy kwadratowej 3x3 i tak aby do każdego z równań były wpisywane kolejno wartości 1,2,3 też nie pomaga, wciąż wyrzuca mi błąd że to musi być macierz kwadratowa. Robienie z x macierzy 3x3 jest takim trochę rozwiązaniem  łopatologicznym, ale nie mam innego pomysłu. Czy ktoś ma może pomysł jak zmodyfikować ten kod, albo jak inaczej to można zrobić?

komentarz zamknięcia: problem rozwiazany

1 odpowiedź

0 głosów
odpowiedź 5 grudnia 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
Pythona nie znam, ale porównując to, co przeczytałem na temat rozwiązywania układów liniowych przy pomocy NumPy, a to, co napisałeś jest zdecydowanie inne.

Ty podajesz tylko jeden wektor współczynników, który jest zresztą błędny. W przykładzie czytałem, że układowi

3*x_1 + x_2 = 9 i x_1 + 3*x_2 odpowiada x = np.array([3, 1], [1, 2]). Wobec tego masz całkiem źle współczynniki wyznaczone.

U Ciebie macierz główna układu powinna wyglądać tak

1^2  1^1  1^0

2^2  2^1  2^0

3^2  3^1  3^0

Innymi słowy powinieneś dostać macierz Vandermonde'a. Więc obstawiam, że powinieneś za x wstawić x = np.array([1 1 1], [1 2 4], [1 3 9])
komentarz 5 grudnia 2020 przez urbanski-paw Nowicjusz (140 p.)
Znaczy wektora współczynników ja w ogóle nie podaje, ja mam go obliczyć, a wektory x i y to po prostu kolejne pary punktów xy. Czyli jak mam np. wielomian y=a+ b*x+ c*x^2, to buduje trzy równania, podstawiając kolejne pary punktów, czyli: 1=a+b+c;  3=a+b*2+c*2^2;  8=a+b*3+c*3^2. Z tego wyznaczam współczynniki a,b,c, i z tego mam ten wielomian który jest dopasowaniem do tych punktów.
komentarz 5 grudnia 2020 przez Whiskey_Taster Pasjonat (15,610 p.)

Ależ właśnie o tym mówię laugh​​​​​​

Współczynniki jakie są przy a, b oraz c to po prostu kolejne potęgi x, prawda? Tak jak napisałeś: 1 = a + b + c, bo 1 = a*1^0 + b*1^1 + c*1^2. I teraz zauważ, że wobec tego można zrobić macierz taką, jaką podałem. Nie wiem, czy miałeś macierze, ale gdy pomnożyć macierz, którą podałem przez wektor [c, b, a]^T (transponowany wektor) i przyrównując ten iloczyn macierzy do wektora [1, 3, 8]^T, to otrzymasz dokładnie ten sam układ równań, który zapisałeś.

To już jest w zasadzie sama algebra, a nie programowanie 

Podobne pytania

0 głosów
0 odpowiedzi 783 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
2 odpowiedzi 195 wizyt
pytanie zadane 29 maja 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)
0 głosów
0 odpowiedzi 640 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)

93,385 zapytań

142,384 odpowiedzi

322,540 komentarzy

62,745 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...