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

question-closed Interpolacja wielomianowa Python

Object Storage Arubacloud
0 głosów
1,639 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 499 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
2 odpowiedzi 150 wizyt
pytanie zadane 29 maja 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)
0 głosów
0 odpowiedzi 440 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...