funktion in funktion ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
david.schienha
User
Beiträge: 2
Registriert: Mittwoch 21. November 2018, 16:27

hallo
ich habe ein Problem mit meinem Programm und währe sehr dankbar wenn mir jemand auf die sprünge helfen kann.

es geht darum ein polynom aus einer liste zu erstellen
mein problem dabei ist ich darf nur eine variable benutzen und diese variable ist meine liste

als beispiel
a=[1, -2, 10**20] daraus soll f(x) = x**2 -2x +10**20 werden


def Polynom_Funktion(a):
r=0
for i in range (len(a)):

variable=a[ i ]*x**(len(a)-i)

r = variable + r

return r


habe natürlich das Problem das x nicht definiert ist
habe es schon mit einer Definition in der Definition probiert aber das funktioniert auch nicht
bin für jede Hilfe dankbar
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht nicht mit nur einer Variablen. Ausser man macht die kuenstlich zum Tupel oder sowas. Du brauchst neben deiner Polynomdefinition als Liste nunmal eine Stelle x, an der das Polynom ausgewertet werden soll. Was sagt denn dein Dozent dazu?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachtrag: was natuerlich geht ist ein Closure:

Code: Alles auswählen

def create_polynom_function(coefficients):
       def evaluate_polynom_at(x):
              ... # hier auf coefficients zu greifen
       return evaluate_polynom_at
Zwei Variablen sind das IMHO immer noch, aber pro Funktion halt nur eine.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und wenn man das sowieso als ”getrickst” ansieht, kann man auch `functools.partial()` verwenden und damit auch die innere Funktion als äussere und damit testbare Funktion.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Man braucht a, x und eine Variable für das Ergebnis; also 3 ist das Minimum.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da Funktionen ja auch Werte sind, kann man bei passender Definition des Begriffs „Variable“ das Minimum noch ein bisschen erhöhen. ;-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
david.schienha
User
Beiträge: 2
Registriert: Mittwoch 21. November 2018, 16:27

Lösung

a ist eine liste und diese liste enthält die Koeffizienten des Polynoms
die stelle der Koeffizienten gibt den Exponenten an
[1 2 3]
1x**2+2*x**1+3*x**0=y

def Hornerschema(a, x0):
b=[0]
for i in range (1, len(a)):
b[0]=a[0]
z=b[i-1]*x0+a
b.append(z)
return b

def Polynom_Funktion(a):
def p(x):
return Hornerschema(a, x)[-1]
return np.vectorize(p)
print(Polynom_Funktion(a),"polynomfunktion")


durch das Horner Schema braucht man kein Polynom erzeugen
das Horner Schema rechnet das Polynom aus und gibt es als liste wieder zurück
wobei das letzte Glied der liste das Ergebnis ist
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@david.schienha: die Funktion `Hornerschema` macht seltsame Dinge. Erst wird die Liste `b` mit einem Eintrag vorbelegt, der innerhalb einer for-Schleife jedes mal wieder mit dem selben Wert überschrieben wird. Was soll der Unsinn?
Dann speichert die Liste `b` jeden Wert, der bei der Auswertung ensteht, obwohl nur der letzte gebraucht wird.
Unpythonisch ist, über den Index der Liste `a` zu gehen, statt direkt die Werte in a zu nehmen.

Hier mal ein Zwischenschritt mit Liste:

Code: Alles auswählen

def Hornerschema(a, x0):
    b = [0]
    for v in a:
        z = b[-1] * x0 + v
        b.append(z)
    return b
und das ganze ohne die unnötige Liste:

Code: Alles auswählen

def Hornerschema(coefficients, x):
    z = 0
    for v in coefficients:
        z = z * x + v
    return z
Funktionen benennt man nach Tätigkeiten, also statt Hornerschema besser evaluate_polynomial, oder abgekürzt polyval, damit sie so heißt, wie die identischen Funktion von numpy, die ihren schrecklichen Namen aber von Matlab geerbt hat.
Antworten