12 svar
86 visningar
David90 behöver inte mer hjälp
David90 13
Postad: 12 nov 17:03

Python: Ett program som löser andragradsekvationer

Har fått i uppgift att skriva ett program i python som löser andragradsekvationer genom att använda pq-formeln. Jag har kommit så långt att programmet löser ekvationer som har två lösningar (verkar så iaf). Problemet är att jag inte vet hur jag ska skriva koden när det bara finns 1 eller ingen reell lösning (misstänker dock att if och else sats ska användas) och behöver en rejäl knuff i rätt riktning för vart i koden den ska ligga och hur den ska formuleras.

Koden ser för tillfället ut såhär (jag vet att den kan skrivas på ett bättre sätt men är nybörjare):

#Ange värden för p och q

p=int(input("Ange ett värde för p:"))

q=int (input ("Ange ett värde för q:"))

#Byt tecken framför p och dividera med 2

p2=(-1/2)*p

#Byt tecken framför q

#Använd pq-formeln x=-(p/2)+/-(p/2)^2-q

losning1=p2+(((p2)**2+(-1)*q)**(1/2))

losning2=p2-(((p2)**2+(-1)*q)**(1/2))

print ("x1=", losning1)

print ("x2=", losning2)

thedifference 410
Postad: 12 nov 17:40

Absolut kommer det krävas lite if och else här. Kan du beskriva på ren svenska först hur du vet att en andragradare har dubbelrot eller att en rot är ickereell?

naytte Online 5168 – Moderator
Postad: 12 nov 17:43 Redigerad: 12 nov 17:47

Jag skulle föreslå en try och except:

Lösning om du vill se efter att du försökt själv.
import math

p=float(input("Ange ett värde för p: "))
q=float(input ("Ange ett värde för q: "))

p2=(-1/2)*p

try:
    
    under_root = (p2 ** 2) - q
    if under_root < 0:
        raise ValueError("Negativt tal under kvadratroten, inga reella lösningar.")

    sol1 = p2 + math.sqrt(under_root)
    sol2 = p2 - math.sqrt(under_root)
    
    print("x1 =", sol1)
    print("x2 =", sol2)

except ValueError as error:
    print(error)

Här importerade jag även biblioteket "math" men om du inte vill göra det kan du skriva som du gjorde förut. Oftast är jag emot att bara ge svaret men jag tycker att det faktiskt har ett ganska stort pedagogiskt värde i programmering. Det handlar till typ 90 % om mönsterseende men för att bygga ett starkt mönsterseende måste man ju också få se mönster. Jag gjorde dessutom om inputsen till floats istället för ints som du gjorde.

David90 13
Postad: 12 nov 17:52 Redigerad: 12 nov 18:00
thedifference skrev:

Absolut kommer det krävas lite if och else här. Kan du beskriva på ren svenska först hur du vet att en andragradare har dubbelrot eller att en rot är ickereell?

En dubbelrot innebär att det finns två stycken nollställen i andragradskurvan, alltså två platser där y=0. En rot som är ickereell saknar sådana nollställen, kurvans maximipunkt ligger under y=0 eller har en minimipunkt som ligger över y=0. Förstår dock inte hur jag ska översätta detta till kod, tyvärr.

David90 13
Postad: 12 nov 17:57
naytte skrev:

Jag skulle föreslå en try och except:

Lösning om du vill se efter att du försökt själv.
import math

p=float(input("Ange ett värde för p: "))
q=float(input ("Ange ett värde för q: "))

p2=(-1/2)*p

try:
    
    under_root = (p2 ** 2) - q
    if under_root < 0:
        raise ValueError("Negativt tal under kvadratroten, inga reella lösningar.")

    sol1 = p2 + math.sqrt(under_root)
    sol2 = p2 - math.sqrt(under_root)
    
    print("x1 =", sol1)
    print("x2 =", sol2)

except ValueError as error:
    print(error)

Här importerade jag även biblioteket "math" men om du inte vill göra det kan du skriva som du gjorde förut. Oftast är jag emot att bara ge svaret men jag tycker att det faktiskt har ett ganska stort pedagogiskt värde i programmering. Det handlar till typ 90 % om mönsterseende men för att bygga ett starkt mönsterseende måste man ju också få se mönster. Jag gjorde dessutom om inputsen till floats istället för ints som du gjorde.

Hmm, grejen är att jag måste kunna förklara koden för handledare/examinator och den där koden kommer jag inte kunna förklara. Dessutom är mycket av det du visar grejer som vi inte har gått igenom, tror snarare att de vill att man ska använda if, else, elif för att visa att man kan grunderna i programmering. 

Då kan du väl jämföra (p/2)^2 med q? Vad måste gälla för differensen (p/2)^2-q för att det ska finnas reella rötter?

David90 13
Postad: 12 nov 18:16
naytte skrev:

Då kan du väl jämföra (p/2)^2 med q? Vad måste gälla för differensen (p/2)^2-q för att det ska finnas reella rötter?

Under rottecknet, i det här fallet uttrycket ((p/2)^2-q)**(1/2) (såg att jag hade glömt att ange detta i koden ovan) saknas reella lösningar om värdet är negativt. Kan jag då skriva:

if (((p/2)^2-q)**(1/2)>0):

print ("Reell lösning saknas") 

Nej, men du kan skriva:

if (p/2)**2-q < 0:

    print("reel lösning saknas")

else:

    ...

David90 13
Postad: 12 nov 18:44
naytte skrev:

Nej, men du kan skriva:

if (p/2)**2-q < 0:

    print("reel lösning saknas")

else:

    ...

Ah, okej, kan jag på samma sätt skriva

elif (p/2)**2-q ==0:

När det finns endast ett nollställe, eller hur gör man då?

Har förresten glömt att tacka för hjälpen så långt, den uppskattas verkligen :)

Du behöver inget krav för när det finns dubbelrot, bara ett krav för vad som ska hända om det saknas reell rot överhuvudtaget.

David90 13
Postad: 12 nov 19:31
naytte skrev:

Du behöver inget krav för när det finns dubbelrot, bara ett krav för vad som ska hända om det saknas reell rot överhuvudtaget.

Om det bara finns en rot då, dvs en maximi eller minimipunkt? Hur kodar jag då för denna?

Bara skriv en if sats som är if sol1 == sol2: …

else: print(sol1, sol2)

med rätt indentering då såklart. Är på mobilen nu så det är svårt att få rätt.

David90 13
Postad: 12 nov 20:22
naytte skrev:

Bara skriv en if sats som är if sol1 == sol2: …

else: print(sol1, sol2)

med rätt indentering då såklart. Är på mobilen nu så det är svårt att få rätt.

Tack så hemskt mycket för hjälpen, tror jag har fått koden att fungera som den ska nu :)

Svara
Close