Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Logg inn

Valgte tags:

Filtrering:

Skriv ut:

1.3.5: Andregradslikningen

1.
Skriv et Python-program som løser andregradsligningen ax²+bx+c=0 ved hjelp av formelen:

alt text

Programmet skal lese inn de tre koeffisientene a, b og c ved hjelp av input()-funksjonen. Deretter skal det skrive ut de to røttene funnet med formelen over. Test programmet på noen eksempler.

2.
Kan du identifisere tilfeller der andregradsformelen bryter sammen? Utvid programmet slik at det oppfører seg fornuftig også i disse situasjonene.

Vis løsningsforslag

oppgave 1
Vi henter inn variablene a, b og c ved hjelp av input og bruker likningen oppgitt i oppgaven. Vi skriver det følgende programmet:

from pylab import * #for å kunne bruke sqrt()

#henter inn variable
a = input("Hva er a?") #henter inn input som string
a = float(a) #konverterer variabel a til flyttall
b = input("Hva er b?") 
b = float(b) 
c = input("Hva er c?") 
c = float(c) 

#regner ut likningen for både pluss og minus
svar1 = (-b+sqrt((b**2.0)-(4.0*a*c)))/(2.0*a)
svar2 = (-b-sqrt((b**2.0)-(4.0*a*c)))/(2.0*a)

print("Likningen har løsningen",round(svar1,3),"og",round(svar2,3))

Funksjonen input() tar alltid inn variabler som en string. Vi må derfor bruke float() i tillegg for å konvertere variablen om til et flyttall.

Alternativt kunne vi erstattet:

a = input("Hva er a?") #tar inn input som string
a = float(a) #konverterer variabel a til flyttall

med:

a = float(input("Hva er a?")) #tar inn input som string og konverterer til flyttall

Dette kunne vi gjort for variablene a,b og c.

Når vi printer bruker vi round()-funksjonen for å runde av tallet til tre desimaler.

En alternativ løsning er å erstatte siste linje med:

print(svar1)
print(svar2)

Vi kjører nå programmet to ganger med forskjellige tall og får:

Hva er a?1
Hva er b?3
Hva er c?1

Likningen har løsningen -0.382 og -2.618


Hva er a?2
Hva er b?4
Hva er c?1

Likningen har løsningen -0.293 og -1.707

Oppgave 2

Etter å ha kjørt programmet flere ganger med forskjellige variabler, legger vi merke til at programmet bryter sammen for noen tall. Når programmet bryter sammen, får vi en feilmelding som ser noe slikt ut:

RuntimeWarning: invalid value encountered in sqrt
  svar1 = (-b+sqrt((b**2.0)-(4.0*a*c)))/(2.0*a)

Fra matematikk vet vi at roten av negative tall gir et imaginært tall. Det finnes altså ingen reell løsning. Vi må derfor introdusere en beslutning som gjør at vi kun regner ut for positive tall under rottegnet. Hvis vi får et negativt tall, skal vi printe ut en feilmelding. Vi kan også justere programmet slik at det bare skriver ut én løsning dersom uttrykket under rotuttrykket blir 0.

Vi gjør dette på følgende måte:

from pylab import sqrt

a = float(input("Hva er a?"))
b = float(input("Hva er b?"))
c = float(input("Hva er c?"))

mintest= ((b**2)-(4.0*a*c))

if mintest>0:
    svar1 = (-b+sqrt((b**2.0)-(4.0*a*c)))/(2.0*a)
    svar2 = (-b-sqrt((b**2.0)-(4.0*a*c)))/(2.0*a)
    print("Likningen har løsningen",round(svar1,3),"og",round(svar2,3))
elif mintest==0:
    svar = (-b/(2*a))
    print("Likningen har løsningen",round(svar,3))
else:
    print("Det finnes kun imaginære løsninger")

Variablen mintest er nå definert som alt under rottegnet. if-betingelsen tester altså om det under rottegnet er positivt eller ikke. Hvis(if) mintest er større enn 0, kjører den koden som står med innrykk. Hvis den er lik 0, kjører elif. Ellers(else) printer den bare en tekststreng som sier at det kun finnes imaginære løsninger.

Programmet kjører nå fornuftig i alle situasjoner.