Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Neljännen asteen yhtälö

Sivun loppuun

DrDeath [02.08.2009 20:53:07]

#

Tein c lups lupsalla oman 4:nen asteen yhtälön ratkaisijan wikipedian kuvauksen mukaan (Ferrari) ja tämän jälkeen vieläpä koitin muidenkin funktioita, mutta yksikään näistä ei aina anna oikeita tuloksia. Eli miten / mistä saisin toimivan 4:nen asteen yhtälöitä ratkaisevan funktion?

Esim. X^4 - 16 = 0 toimii, mutta x^4 + x^3 = 0 ei toimi. Eli ekassa funktiot palauttavat +-2 ja tokassa mikään niistä ei tajunnut, että yksi vastauksista on 0.

Jaska [02.08.2009 21:37:22]

#

Jos likiarvot kelpaa, niin Newtonin iteraatio on helpompi tehdä. Muuten pitää vaan koodata kaava ja olla huolellinen. Esimerkiksi Maplella voit katsoa valmiin kaavan ja koodata sen. Kaava tosin vaatii tapaustarkastelua; esimerkiksi jos kysyy ratkaisua yhtälölle x^4+ax^3+d=0, niin ratkaisu tulostuu, mutta jos tätä soveltaa tapauksessasi x^4 + x^3 = 0, niin tulee nollalla jako. Lisäksi vaikka kaava olisikin ohjelmoitu oikein, niin se saattaa näyttää vastauksen kummallisessa muodossa, ellei siihen tee algoritmia, joka sieventää juurilausekkeiden summia, osamääriä ja sisäkkäisiä juurilausekkeita. Esimerkkinä sqrt(3+2 sqrt(2))=1+sqrt(2). Englanninkielinen Wikipedia sanoo seuraavaa:

In 1991, a polynomial time Monte Carlo algorithm was proposed for determining whether a sum of radicals is zero, or more generally whether it represents a rational number.

ja antaa viitteen artikkeliin http://ieeexplore.ieee.org/search/wrapper.jsp?arnumber=185434 . Ongelman voi tietysti välttää etsimällä ensiksi rationaalijuuret, http://en.wikipedia.org/wiki/Rational_root_theorem , ja sitten palauttaa juurilausekkeena muut juuret. Tällöin polynomin kertoimien tulee olla rationaalilukuja.

SAGE on avoimen lähdekoodin ohjelmisto, joka muistaakseni hallitsee kanssa neljännen asteen yhtälön ratkaisukaavan.

DrDeath [02.08.2009 22:54:57]

#

iterointi kävisi muuten, mutta joskus likiarvo karkaa väärään suuntaan. En tarvitse mitään ihmeen sievennintä vaan nopean menetelmän juurien löytämiseen. Pitää vielä katsoa se sage, kunhan pääsen koneelle.

Jaska [02.08.2009 23:23:40]

#

Tulipa mieleen sivu http://www.wolframalpha.com/input/?i=x^4+a*x^3+b­*x^2+c*x+d=0 Puolitushaulla saa kanssa likiarvon nopeasti.

Jaska [03.08.2009 01:36:32]

#

Äh. Ajattelin turhan monimutkaisesti. Ratkaisukaavassahan tarvitaan juuria, joiden approksimaatioon käytetään yleensä Newtonia. Siten on huomattavasti helpompaa tehdä se alkuperäiseen neljännen asteen yhtälöön. Missä tapauksissa muka likiarvo karkaa väärään suuntaan? Mulle ei tule mieleen esimerkkiä. Ainakin voi kokeilla muutamalla eri alkuarvolla, jos jollakin tietyllä alkuarvolla ei lähde suppenemaan.

os [03.08.2009 09:11:59]

#

Newtonin menetelmä ei sellaisenaan todellakaan ole mikään pomminvarma tapa löytää nopeasti funktion f kaikkia nollakohtia. Summittaisella alkuarvauksella menetelmä kyllä todennäköisesti suppenee aika pian johonkin nollakohtaan, mutta mielivaltaisen (neljännen asteen) polynomin kaikkien nollakohtien löytäminen luotettavasti vaatii hieman enemmän eforttia.

Jaska [03.08.2009 10:52:14]

#

Ei pomminvarmaa tapaa olekaan olemassa. Esimerkiksi yhtälölle x^4+10^{-100000}=0 voi helposti saada ratkaisuksi x=0 pyöristysvirheistä johtuen, vaikka reaalijuuria ei ole. Vastaavasti voidaan kehittää neljännen asteen yhtälö, joka on kaikkialla positiivinen, mutta jolle tietokone löytää nollakohdan origossa riippumatta siitä, kuinka monen bitin tarkkuudella luvut on tallennettu.

Laitinen [03.08.2009 11:26:54]

#

Jaska kirjoitti:

Äh. Ajattelin turhan monimutkaisesti. Ratkaisukaavassahan tarvitaan juuria, joiden approksimaatioon käytetään yleensä Newtonia. Siten on huomattavasti helpompaa tehdä se alkuperäiseen neljännen asteen yhtälöön. Missä tapauksissa muka likiarvo karkaa väärään suuntaan? Mulle ei tule mieleen esimerkkiä. Ainakin voi kokeilla muutamalla eri alkuarvolla, jos jollakin tietyllä alkuarvolla ei lähde suppenemaan.

Ratkaisukaavallahan ne juuret ratkaistaan. Yllä antamasi Wolfram Alpha -linkki antaa aivan validit kaavat. Lukujen tarkkuus on sen sijaan oikea ongelma, jota voi tosin yrittää kiertää laskemalla symbolisesti.

os [03.08.2009 20:17:58]

#

Laitinen kirjoitti:

Ratkaisukaavallahan ne juuret ratkaistaan.

http://en.wikipedia.org/wiki/Root-finding_algorithm#Finding_roots_of_polynomials:

However, even this degree-two solution should be used with care to ensure numerical stability, the degree-four solution is unwieldy and troublesome, and higher-degree polynomials have no such general solution.

... eli ei.

Jaska kirjoitti:

Ei pomminvarmaa tapaa olekaan olemassa. Esimerkiksi yhtälölle x^4+10^{-100000}=0 voi helposti saada ratkaisuksi x=0 pyöristysvirheistä johtuen, vaikka reaalijuuria ei ole. Vastaavasti voidaan kehittää neljännen asteen yhtälö, joka on kaikkialla positiivinen, mutta jolle tietokone löytää nollakohdan origossa riippumatta siitä, kuinka monen bitin tarkkuudella luvut on tallennettu.

Totta toki, mutta numeeriset ongelmat alkavat helposti kummitella valitettavan usein myös ihan "normaaleissa" ja yksinkertaisissa sovelluksissa. Yllä lainattu Wikipedia-artikkeli voi antaa lisätietoa aiheesta ja tarjonnee vastauksen myös ketjun aloittajan alkuperäiseen kysymykseen.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta