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

question-closed Interpolacja wielomianowa Python

VPS Starter Arubacloud
0 głosów
1,594 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 470 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
2 odpowiedzi 146 wizyt
pytanie zadane 29 maja 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)
0 głosów
0 odpowiedzi 429 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)

92,455 zapytań

141,263 odpowiedzi

319,100 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...