Polynomekvations kalkylator
Håller på att koda ett program som ska lösa alla sorters polynomekvationer. Jag vill inte använda mig av solve() funktionen och undrar hur man kan skriva koderna manuellt? Har ni något tips på hur man skulle göra ett program som exempelvis kan lösa nedanstående ekvationer:
eller
Tack på förhand!
Menar du en exakt lösning, med t. ex. pq-formeln, eller en numerisk, där man itererar sig fram till ett tillräckligt noggrant värde?
Vilket det än är sä finns det kod som du kan använda, eller vill du skriva allting själv?
Laguna skrev:Menar du en exakt lösning, med t. ex. pq-formeln, eller en numerisk, där man itererar sig fram till ett tillräckligt noggrant värde?
Vilket det än är sä finns det kod som du kan använda, eller vill du skriva allting själv?
En numerisk lösning med t.ex. Newton-Rafsons metod.
Vill helst skriva det själv :)
Ska funktionen anges i form av programkod, eller ska man bara mata in en formel så gör programmet resten?
Laguna skrev:Ska funktionen anges i form av programkod, eller ska man bara mata in en formel så gör programmet resten?
Funktionen ska matas in....
Marx skrev:Laguna skrev:Ska funktionen anges i form av programkod, eller ska man bara mata in en formel så gör programmet resten?
Ekvationen ska matas in...
Då behöver du skriva en parser som kan läsa in en formel och returnera nån sorts struktur som man sen kan evaluera för olika värden på x.
Då kan du också derivera så du får en formel för derivatan och inte behöver beräkna den med derivatans definition och nåt lagom värde på h.
Ett alternativ är att formeln ges i python-syntax, så kan du använda 'eval'.
Laguna skrev:Då behöver du skriva en parser som kan läsa in en formel och returnera nån sorts struktur som man sen kan evaluera för olika värden på x.
Då kan du också derivera så du får en formel för derivatan och inte behöver beräkna den med derivatans definition och nåt lagom värde på h.
Ett alternativ är att formeln ges i python-syntax, så kan du använda 'eval'.
Finns det något annat sätt att förenkla ekvationen utan att använda eval() ?
Du kan ju tvinga användaren att använda ett begränsat format, t. ex. 3x^2 + 4x = 0,men inte sådana formler som du gav som exempel.
Men jo, kanske, men du behöver kunna räkna ut t.ex. 3*(0,9/2-4) när du har den som textsträng.
Laguna skrev:Du kan ju tvinga användaren att använda ett begränsat format, t. ex. 3x^2 + 4x = 0,men inte sådana formler som du gav som exempel.
Men jo, kanske, men du behöver kunna räkna ut t.ex. 3*(0,9/2-4) när du har den som textsträng.
Ja, det är sant att man kan tvinga användaren att skriva ekvationen som du har skrivit.
Jag har räknat med att det ska bli ganska komplicerad
Ett första mål kan vara att skriva kod som kan parsa t.ex. 2+3*4 på rätt sätt. Hitta på en representation som klarar alla fall som kan uppstå och som går att evaluera enkelt. T.ex. kunde 2+3*4 bli ('+', 2, ('*', 3, 4)).
Man slipper skriva en egen parser om man använder en färdig modul för det, t ex compiler, Equation eller parser.
import parser
from math import sin
formula = "sin(x)*x**2"
code = parser.expr(formula).compile()
x = 10
print(eval(code))
Modulen numpy
har många användbara funktioner för att hantera värden och uttryck. Funktionen polyder
kan derivera ett polynom. Polynomet behöver dock skrivas på ett visst format, vilket visas som exempel i koden nedan. Jobbet med parsing kvarstår om användaren av ditt program inte skriver in polynomet på det formatet. De numeriska approximationerna bör sedan vara ganska enkla att koda.
import numpy as np
# x^2 + 3x = (2x + 1)^2
# x^2 + 3x = 4x^2 + 4x + 1
# 0 = 3x^2 + x + 1
p = np.poly1d([3, 1, 1]) # Polynomet p : 3x^2 + x + 1
d = np.polyder(p) # Derivatan d : 6x + 1
print(d(-1/6))
print(p(-1/6))
Visa spoiler
Gjorde ett snabbhack som tar polynom på formen "5x^4-3x^2+7x-1" och ekvationer på formen "3x^2+4x=0". Det klarar även motsvarande uttryck i Python-syntax, d v s "5*x**4-3*x**2+7**x-1" respektive "3*x**2+4*x=0".