Gå til innhold
Trenger du skole- eller leksehjelp? Still spørsmål her ×

Løse annen og tredjegradslikninger på maskin


Anbefalte innlegg

Heisann folkens =)

 

Jeg holder på å utvikle et program som skal være til hjelp for alle som tar matte, fysikk og/eller kjemi på videregående, og i den sammenhengen trenger jeg en likningsløser som kan løse likninger uansett hvordan de er satt opp:

ie. Den kan løse både

x^2-3x+2 = 0

og

x^2=3x-2

 

Problemet er at en maskin ikke kan tenke på samme måten som oss, så den kan ikke bare "flytte" ting fra en side til en annen, eller løse ut pareneteser..

Dette gjør ting litt vanskelig for meg :p

 

Jeg har funnet ut at man kan løse enhver linjær likning (ikke noe opphøyd i) ved å bytte ut likhetstegnet med et minustegn, og så bytte ut x med det komplekse tallet i (= sqr(-1) ). Man tar så negativen til realdelen til svaret man får og deler på den imaginære delen.

3x - 2 + 2x = 10x - (x/5)

3i - 2 + 2i - (10i - (i/5))

5i - 2 - 10i + (i/5)

-5i - 2 + (i/5)

(-24/5)i - 2

x = -(-2) / (-24/5)

x = (2*5)/-24

x = -(10/24) = -(5/12)

Hvis du prøver å løse den på den "vanlige" metoden vil du se at svarene er like

Denne metoden kalles "Newtons metode", og fungerer med en hver likning..

 

Spørsmålet mitt blir så, kjenner noen til en måte dette kan gjøres på for annen/tredjegradslikninger? Eller noen har noen idé til hvordan slikt kan løses når man ikke kan flytte rundt på ting..

 

Jeg vet at denne posten kanskje ikke passer under Skole/leksehjelp, men er ikke noen egen mattedel her ^^

 

Håper på hjelp,

Jon

Endret av Jonhoo
Lenke til kommentar
Videoannonse
Annonse

Vet ikke hvilket språk du bruker, men her er litt kode jeg har brukt på skolen, C++.

 

Funksjonen andregrad() løser andregradslikninger. Du kan ikke skrive inn likningen selv, men oppgir konstantene a, b og c.

Vet ikke hvordan dette blir seende ut postet på forumet, men orker ikke formatere det ...

 

void andregrad()
{
double dblA;        //Inndata
double dblB;
double dblC;

double dblM1;        //Utrekning/utdata
double dblM2;
double dblM3;
double dblM4;

cout << "Andregradslikning: aX^2 +  bX + C\n";
cout << "Hugs aa oppgi alle tal numerisk. A kan ikkje vere 0.\n\n";
do 
{
 cout << "Oppgi A: ";
 cin >> dblA;
}
while(inntest() || dblA == 0);    //Kan ikkje dele på 0

do 
{
 cout << "Oppgi B: ";
 cin >> dblB;
}
while(inntest());      	//Gjennomfør heilt til inntest == false

do 
{
 cout << "Oppgi C: ";
 cin >> dblC;
}
while(inntest());

dblM1 = pow(dblB, 2) - (4 * dblA * dblC);	//Reknar ut talet under rotteiknet
if(dblM1 < 0)        //Talet negativt?
{
 cout << "\nTalet " << dblM1 << " under rotteiknet er negativt.\n";
 cout << "Likninga har komplekse loysingar:\n";
 dblM3 = (-dblB) / (2 * dblA);
 dblM4 = sqrt(abs(dblM1)) / (2 * dblA);	//Tar absoluttverdien av det negative talet for å kunne finne rota
 cout << "Loysing 1: " << dblM3 << " + " << dblM4 << "i\n";
 cout << "Loysing 2: " << dblM3 << " - " << dblM4 << "i\n";
}
else if(dblM1 == 0)      	//Talet lik 0?
{
 dblM2 = -dblB / (2 * dblA);
 cout << "Loysinga er " << dblM2 << ".\n";
}
else if(dblM1 > 0 || dblM1 != 0)  	//Talet positivt?
{
 cout << "Talet under rotteiknet er " << dblM1 << ".\n";
 dblM3 = (-dblB + sqrt(dblM1)) / (2 * dblA);
 cout << "Loysing 1: " << dblM3 << endl;
 dblM4 = (-dblB - sqrt(dblM1)) / (2 * dblA);
 cout << "Loysing 2: " << dblM4 << endl;
}
}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...