Gå til innhold

Lagranges Interpolasjon i Python - Hvordan implementere?


Anbefalte innlegg

Okei folkens, skal skrive et program som skal kunne bruke Lagranges Interpolasjonsformel. Det ser sånn ut til nå:

 

from scitools.std import * 

def f(x):
return sin(x)

class Lagrange:

def __init__(self, x_list, y_list):
	self.x_list = x_list
	self.y_list = y_list

def __call__(self, x):
	L_list = []
	k = (len(x_list)-1)
	Lagrange0 = 0
	for j in range(1, k):
	for k in range(0, k):
	Lk = ((x - self.x_list[k])/float((self.x_list[j] - self.x_list[k])))
	if Lagrange0 == 0:
	Lagrange0 += Lk
	else:
	Lagrange0 = Lk*Lagrange0
	print Lk
	L_list.append(Lk)

	Poly0 = 0
	for k in range(0, len(x_list)):
	Poly = self.y_list[k] * L_list[k]
	Poly0 += Poly

	return Poly0


x_list = [(pi/5.)*i for i in range(1,6)]
y_list = [f(m) for m in x_list]

ex1 = Lagrange(x_list, y_list)

for x in x_list:
print ex1(x)

 

Men jeg får zerodivision, noe jeg skjønner på grunn av at de x-verdiene jeg skal bruke når jeg skal regne ut verdien av selve interpolasjon gjør at det allerede i første runden av for-løkken blir null over brøken..

 

Noen som har noen tips? Sitter litt fast, men skulle så gjerne fått det til :)

 

EDIT: Ser ikke ut som om innrykkene kommer med der.. Søren altså..

Endret av Selvin
Lenke til kommentar
Videoannonse
Annonse

Men jeg får zerodivision, noe jeg skjønner på grunn av at de x-verdiene jeg skal bruke når jeg skal regne ut verdien av selve interpolasjon gjør at det allerede i første runden av for-løkken blir null over brøken..

 

0 i telleren ville ikke ha gitt deg ZeroDivision.

 

Noen som har noen tips? Sitter litt fast, men skulle så gjerne fått det til :)

 

 

Hvis du snakker om Lagrange interpolating polynomial, så er det et par ting som forvirrer meg:

 

   for j in range(1, k):
       for k in range(0, k):

 

Hvordan er dette ment til å virke?

 

... og (hvis vi ser bort fra indekstabben), hvorfor tar du ikke hensyn til det ene spesialtilfellet her:

 

   for k in range(0, k):
       Lk = ((x - self.x_list[k])/float((self.x_list[j] - self.x_list[k])))

 

... som er k == j?

 

 

EDIT: Ser ikke ut som om innrykkene kommer med der.. Søren altså..

 

'\t' er djevelens verk i koden.

Lenke til kommentar

Da har jeg kommet frem til et par ting, pluss mikset og trikset litt. Ser sånn ut nå:

 

class Lagrange:

def __init__(self, x_list, y_list):
	self.x_list = x_list
	self.y_list = y_list

def __call__(self, x):
	L_list = []
	k = (len(x_list))
	Lagrange0 = 0
	poly0 = 0
	i = 0
	for s in range(0,k):
	for k in range(0, k):
	if s == k:
	continue
	else:
	Ls = (x - self.x_list[k])/(self.x_list[s] - self.x_list[k])
	if Lagrange0 == 0:
	Lagrange0 += Ls
	else:
	Lagrange0 = Lagrange0*Ls
	L_list.append(Lagrange0)

	while i <= k:
	poly = self.y_list[i]*L_list[i]
	poly0 += poly
	i += 1
	return poly0

 

Jeg tror dette virker, men er søren ikke helt sikker. Det eneste jeg synes er dumt med dette er at du ikke får ut en funksjon, hadde jeg fått ut en funksjon ville alt vært så mye lettere..

 

Og hvordan får man innrykk her på forumet?

Endret av Selvin
Lenke til kommentar

Da fikk jeg det til! Ah, knall! Sluttkoden ble slik:

 

class Lagrange:

def __init__(self, x_list, y_list):
	self.x_list = x_list
	self.y_list = y_list

def __call__(self, x):
	k = (len(self.x_list))
	poly0 = 0
	i = 0
	L_list = []
	for s in range(0,k):
	Lagrange0 = 1
	for m in range(0, k):
	if s != m:
	Ls = (x - self.x_list[m])/(self.x_list[s] - self.x_list[m])
	Lagrange0 = Lagrange0 * Ls
	else:
	continue
	L_list.append(Lagrange0)
	while i < k:
	poly = self.y_list[i]*L_list[i]
	poly0 = poly0 + poly
	i = i + 1
	return poly0

Lenke til kommentar
  • 3 uker senere...

Det som er problemet ditt er at du har definert variabelen feil.

 

 

 

Før det første så må du slette hele filen og starte på nytt, for det andre, så er dette meget ubrukelig.

 

 

Alt i alt; Se over variablene, du har gjort kjempe mange feil. Men det er vel sånn nybegynnere er.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...