Domanda

Sono completamente un principiante nella programmazione, quindi per favore dimmi se la risposta alla mia domanda è molto evidente ed ovvia.

Ho iniziato ad imparare Python a settimana fa, e avendo appreso le basi dell'utilizzo del Metodo Newton-Raphson Per risolvere le equazioni, ho trovato un pezzo di codice che può darti atleat (solo) 1 soluzione di un'equazione cubica. Ecco il codice che ho ideato: -

def deg3(a,b,c,d,g):  
    y=a*g**3+b*g**2+c*g+d
    return y
def solvedeg3equation():
    e=float(input("e= ")) #for ax^3+bx^2+cx+d=0, with maximum error of e
    a=float(input("a= "))
    b=float(input("b= "))
    c=float(input("c= "))
    d=float(input("d= "))
    count=1
    g=0.01
    while abs(deg3(a,b,c,d,g))>e and count<=100:
        count=count+1
        if 3*a*g**2+2*b*g+c==0:
            g=g+0.001
        g=g-deg3(a,b,c,d,g)/(3*a*g**2+2*b*g+c)
    if count<=100:
        print("The best guess is:",g)
        print("iterations required: ",count)
    else:
        print("maximum iterations exceeded ")
        print("iterations: ",count,"current guess: ",g)  
.

Una delle scorte del metodo del Newton è che o F '(x)= 0, dà un errore matematico e si bloccano. Per superare questo, ho usato G= G + 0.001, se il valore corrente di G dà un derivato zero, dove G è l'ipotesi corrente. C'è un modo migliore per rimuovere questo problema, senza utilizzare funzioni complesse?

Un'altra domanda che ho è, posso includere la fornitura di fornire più di una radice con piccole modifiche al codice? un'idea è cambiare l'ipotesi in modo tale da portare le iterazioni successive su un'altra radice. Ma non so come fare una tale ipotesi, data una soluzione.

È stato utile?

Soluzione

Fai una seconda procedura per il derivato.Ancora meglio, creare una classe per le funzioni numeriche che tiene i coefficienti ottenuti durante l'inizializzazione e fornendo metodi per valore e derivati.

Usa X / (EPS ^ 2 + X ^ 2) per desingolarizzare la funzione 1 / x.Praticamente, questo dovrebbe non svolgere alcun ruolo poiché la convergenza a più radici è lenta così in implementazioni più avanzate è necessario implementare il codice per rilevare questo e accelerare.

Per ottenere le altre radici, utilizzare lo schema Horner-Ruffini per calcolare il polinomio quadratico sgonfiatico e risolvere questo utilizzando la formula della soluzione.

e prova ad evitare il calcolo dello stesso valore più volte.Questo non è importante qui, ma per funzioni più costose questo diventa critico.

Altri suggerimenti

Ho fatto il programma usando C per calcolare le radici di qualsiasi utente inserito polinomiale in un determinato intervallo.Questo è il link al codice

Programma del metodo di Newton (in c) in esecuzione in esecuzioneinfinitamente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top