Tässä tehtävässä harjoitellaan erityisesti seuraavia asioita:
Tee Eclipseen uusi projekti, jonka nimi on tehtava4_3, ja luo tähän projektiin moduuli nollakohta, joka hakee likiarvon kolmannen asteen yhtälön
2 * x ** 3 - 13 * x ** 2 - 74 * x + 40 = 0ratkaisulle alla kuvatulla menetelmällä.
Minkä tahansa jatkuvan funktion f(x) nollakohdalle voidaan etsiä likiarvo halutulla tarkkuudella (lukujen tallentamiseen käytetyn tarkkuuden ja pyöristysvirheiden määrämissä rajoissa), jos tunnetaan kaksi pistettä, joissa toisessa funktion arvo on negatiivinen ja toisessa positiivinen. Koska funktio on jatkuva, sen täytyy saavuttaa arvo nolla jossain kohdassa näiden pisteiden välillä.
Tutkitaan funktion arvo annetun välin keskipisteessä. Jos arvo keskipisteessä on tasan 0, nollakohta on löytynyt ja voidaan lopettaa. Muuten jos arvo keskipisteessä on erimerkkinen kuin arvo välin alkupisteessä, voidaan nollakohdan hakua jatkaa alkupisteen ja keskipisteen väliltä. Jos taas arvo keskipisteessä on erimerkkinen kuin arvo välin loppupisteessä, voidaan hakua jatkaa keskipisteen ja loppupisteen väliltä. Hakua jatketaan nyt uudelta väliltä hakemalla sen keskipiste, laskemalla funktion arvo siinä ja päättelemällä, kannattaako hakua jatkaa uuden välin alku- vai loppupuolelta (vai löytyikö täsmällinen ratkaisu välin puolivälistä). Näin jatketaan niin kauan, että välin pituus on korkeintaan kaksi kertaa haluttu tarkkuus. Haku siis lopetetaan silloin, kun välin pituus on pienempi tai yhtäsuuri kuin kaksi kertaa haluttu tarkkuus. Tällöin ratkaisu on viimeisen välin keskipiste, josta oikea nollakohta on korkeintaan halutun tarkkuuden päässä.
Jos alkuperäisellä välillä on useita nollakohtia, menetelmä löytää niistä vain yhden.
Kirjoita ohjelma, joka ratkaisee kolmannen asteen yhtälön
2 * x ** 3 - 13 * x ** 2 - 74 * x + 40 = 0
kuvatulla menetelmällä. Kirjoita ohjelmasi niin, että
se tulostaa löytyneen ratkaisun lisäksi funktion arvon tutkituissa
keskipisteissä (näin Goblin pystyy tarkistamaan, että ohjelmasi
todella käyttää kuvattua menetelmää). Katso mallia esimerkkisuorituksesta.
Kirjoita ohjelmaasi seuraava funktio:
2 * x ** 3 - 13 * x ** 2 - 74 * x + 40
arvon pisteessä
x
.
Kirjoita sitten pääohjelma, joka pyytää käyttäjältä ensin tarkasteltavan välin ala- ja ylärajan. Pääohjelma tarkistaa, että alaraja ei ole ylärajaa suurempi ja että polynomin arvo on todella erimerkkinen välin päätepisteissä. Lisäksi se tutkii, onko polynomin arvo nolla jommassa kummassa päätepistessä. Nämä tarkistukset ja erikoistapaukset on jo kirjoitettu valmiiksi alla annettuun koodiin. Sinun tehtävänäsi on kirjoittaa funktio polynomin_arvo, lähtötietojen kysyminen ja varsinaisen menetelmän käyttö yhtälön ratkaisemiseen perustapauksessa. Kopioi siis alla oleva koodi moduulisi ja täydennä sitä:
# kirjoita tahan funktion polynomin_arvo maarittely def main(): print "Ohjelma laskee kolmannen asteen yhtalon" print "2 * x ** 3 - 13 * x ** 2 - 74 * x + 40 = 0" print "yhden ratkaisun likiarvon haluamallasi valilla." # kirjoita tahan koodi, joka pyytaa ja lukee halutun valin alarajan # muuttujaan ala, ylarajan muuttujaan yla seka tarkkuuden kolmanteen # muuttujaan. if ala > yla: print "Antamasi vali on tyhja." elif polynomin_arvo(ala) * polynomin_arvo(yla) > 0: print "Polynomin arvo on valin molemmissa paissa samanmerkkinen." print "Menetelma ei sovi talle valille." elif polynomin_arvo(ala) == 0.0: print "Ratkaisu on x =", ala elif polynomin_arvo(yla) == 0.0: print "Ratkaisu on x =", yla else: # kirjoita tahan koodi, joka ratkaisee yhtalon tehtavanannossa # kuvatulla menetelmalla ja tulostaa polynomin arvot kaytetyissa # valipisteissa ja lopulta ratkaisun. main()
Eclipsen yllä annetussa koodissa ilmoittama virhe häviää, kun täydennät else-kohtaa tarvittavalla koodilla. Ohjelmasi ei tarvitse varautua käyttäjän virheellisiin syötteisiin muuten kuin mitä annetussa koodipohjassa on jo tehty.
Testaa ohjelmaasi useita kertoja Eclipsessä antamalla eri välien alku- ja loppupisteitä ennen kuin palautat ohjelman Gobliniin. Yritä löytää ohjelman avulla kaikki yhtälön kolme ratkaisua. Palauta Gobliniin tiedosto nollakohta.py.
[ohjelman suoritus alkaa] Ohjelma laskee kolmannen asteen yhtalon 2 * x ** 3 - 13 * x ** 2 - 74 * x + 40 = 0 yhden ratkaisun likiarvon haluamallasi valilla. Anna valin alaraja. 0.0 Anna valin ylaraja. 9.0 Anna haluttu tarkkuus. 0.0005 Polynomin arvo pisteessa 4.5 on -374.0 Polynomin arvo pisteessa 2.25 on -169.53125 Polynomin arvo pisteessa 1.125 on -56.85546875 Polynomin arvo pisteessa 0.5625 on -5.38232421875 Polynomin arvo pisteessa 0.28125 on 18.2036743164 Polynomin arvo pisteessa 0.421875 on 6.61769866943 Polynomin arvo pisteessa 0.4921875 on 0.667357444763 Polynomin arvo pisteessa 0.52734375 on -2.34532654285 Polynomin arvo pisteessa 0.509765625 on -0.835912749171 Polynomin arvo pisteessa 0.5009765625 on -0.0835056286305 Polynomin arvo pisteessa 0.49658203125 on 0.29211942316 Polynomin arvo pisteessa 0.498779296875 on 0.104355212388 Polynomin arvo pisteessa 0.499877929688 on 0.0104368627035 Polynomin arvo pisteessa 0.500427246094 on -0.0365313662519 Ratkaisu on x = 0.500152587891 [ohjelman suoritus päättyy]
[ohjelman suoritus alkaa] Ohjelma laskee kolmannen asteen yhtalon 2 * x ** 3 - 13 * x ** 2 - 74 * x + 40 = 0 yhden ratkaisun likiarvon haluamallasi valilla. Anna valin alaraja. 2.0 Anna valin ylaraja. 9.0 Anna haluttu tarkkuus. 0.05 Polynomin arvo on valin molemmissa paissa samanmerkkinen. Menetelma ei sovi talle valille. [ohjelman suoritus päättyy]
[ohjelman suoritus alkaa] Ohjelma laskee kolmannen asteen yhtalon 2 * x ** 3 - 13 * x ** 2 - 74 * x + 40 = 0 yhden ratkaisun likiarvon haluamallasi valilla. Anna valin alaraja. 0.5 Anna valin ylaraja. 5.0 Anna haluttu tarkkuus. 0.005 Ratkaisu on x = 0.5 [ohjelman suoritus päättyy]
[ohjelman suoritus alkaa] Ohjelma laskee kolmannen asteen yhtalon 2 * x ** 3 - 13 * x ** 2 - 74 * x + 40 = 0 yhden ratkaisun likiarvon haluamallasi valilla. Anna valin alaraja. 8.0 Anna valin ylaraja. 4.5 Anna haluttu tarkkuus. 0.005 Antamasi vali on tyhja. [ohjelman suoritus päättyy]
Värikoodit:
Sininen: Syöte käyttäjältä
Vihreä: Ohjelman tuloste
Punainen: Erityishuomatus: ei tulosteta