14 svar
402 visningar
Marx 357
Postad: 20 jan 2021 18:37

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 28443
Postad: 20 jan 2021 18:57

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 357
Postad: 20 jan 2021 18:59 Redigerad: 20 jan 2021 19:00
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 28443
Postad: 20 jan 2021 19:00

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

Marx 357
Postad: 20 jan 2021 19:03
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 357
Postad: 20 jan 2021 19:03
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 28443
Postad: 20 jan 2021 19:08

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 357
Postad: 20 jan 2021 19:16
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 28443
Postad: 20 jan 2021 19:23

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 357
Postad: 20 jan 2021 19:29
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 28443
Postad: 20 jan 2021 19:48

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 820 – Lärare
Postad: 20 jan 2021 21:32

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 820 – Lärare
Postad: 22 jan 2021 15:31

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 820 – Lärare
Postad: 5 feb 2021 15:47
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 357
Postad: 5 feb 2021 16:01
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