14 svar
155 visningar
Marx 283
Postad: 20 jan 2021

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:

3x+5=3(12x-4)

eller

x2+3x=(2x+1)2

 

Tack på förhand!

Laguna 13518
Postad: 20 jan 2021

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? 

Marx 283
Postad: 20 jan 2021 Redigerad: 20 jan 2021
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 :)

Laguna 13518
Postad: 20 jan 2021

Ska funktionen anges i form av programkod, eller ska man bara mata in en formel så gör programmet resten? 

Marx 283
Postad: 20 jan 2021
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 283
Postad: 20 jan 2021
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...

Laguna 13518
Postad: 20 jan 2021

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'. 

Marx 283
Postad: 20 jan 2021
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() ?

Laguna 13518
Postad: 20 jan 2021

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. 

Marx 283
Postad: 20 jan 2021
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

Laguna 13518
Postad: 20 jan 2021

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)).

Lindehaven 691 – Lärare
Postad: 20 jan 2021

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))
Lindehaven 691 – Lärare
Postad: 22 jan 2021

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))
Lindehaven 691 – Lärare
Postad: 5 feb 2021
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".

Marx 283
Postad: 5 feb 2021
Lindehaven skrev:
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".

Toppen! Ska prova det själv också. 

Svara Avbryt
Close