Newtonin menetelmä

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 25. tammikuuta 2022 tarkistetusta versiosta . tarkastukset vaativat 3 muokkausta .

Newtonin menetelmä, Newtonin algoritmi ( tunnetaan myös tangenttimenetelmänä ) on iteratiivinen numeerinen menetelmä tietyn funktion juuren ( nolla ) löytämiseksi . Menetelmän ehdotti ensimmäisenä englantilainen fyysikko , matemaatikko ja tähtitieteilijä Isaac Newton ( 1643-1727 ) . Ratkaisun etsintä tehdään peräkkäisten approksimaatioiden muodostamalla ja se perustuu yksinkertaisen iteroinnin periaatteisiin . Menetelmällä on neliöllinen konvergenssi . Menetelmän muunnos on sointujen ja tangenttien menetelmä . Newtonin menetelmällä voidaan myös ratkaista optimointiongelmia , joissa moniulotteisen avaruuden tapauksessa on määritettävä ensimmäisen derivaatan tai gradientin nolla.

Menetelmän kuvaus

Perustelut

Yhtälön ratkaisemiseksi numeerisesti yksinkertaisella iteraatiomenetelmällä se on pelkistettävä vastaavaan yhtälöön: , missä  on supistumiskuvaus .

Jotta menetelmän konvergenssi olisi paras seuraavan approksimoinnin pisteessä , ehdon on täytyttävä . Tämän yhtälön ratkaisua etsitään muodossa , jolloin:

Olettaen, että approksimaatiopiste on "riittävän lähellä" juuria ja annettu funktio on jatkuva , lopullinen kaava on:

Tätä silmällä pitäen funktio määritellään:

Tietyissä olosuhteissa tämä toiminto suorittaa supistuksen kartoituksen juuren läheisyydessä.

Todiste

Olkoon annettu reaalimuuttujan funktio , joka on kahdesti jatkuvasti differentioituva määritelmäalueellaan ja jonka derivaatta ei koskaan katoa:

Ja on tarpeen todistaa, että funktio suorittaa supistumiskartoituksen lähellä yhtälön juurta .

Johtuen funktion jatkuvasta differentiatiivisuudesta ja nollan epäyhtälöstä, sen ensimmäinen derivaatta on jatkuva .

Johdannainen on:

Se on myös jatkuvaa :lle asetettujen ehtojen mukaisesti . Olkoon  yhtälön haluttu juuri: , siis sen läheisyydessä :

Sitten Lagrangen lauseen mukaan :

Johtuen siitä, että samassa delta-alueella, seuraava pitää paikkansa:

Näin saatu funktio juuren naapurissa toteuttaa supistumismappauksen .

Tässä tapauksessa yhtälön numeerisen ratkaisun löytämisalgoritmi pelkistetään iteratiiviseksi laskentamenettelyksi :

Banachin lauseen mukaan approksimaatioiden sarja pyrkii yhtälön juureen .

Geometrinen tulkinta

Menetelmän pääidea on seuraava: alkuperäinen approksimaatio asetetaan hypoteettisen juuren lähelle, minkä jälkeen piirretään tarkasteltavan funktion kaavion tangentti approksimaatiopisteeseen, jonka leikkaus abskissa-akselin kanssa on löytyi. Tämä piste on otettu seuraavaksi approksimaatioksi. Ja niin edelleen, kunnes vaadittu tarkkuus on saavutettu.

Olkoon 1) reaaliarvoinen funktio jatkuvasti differentioituva välillä  ; 2) on pakollinen kohta  :  ; 3) on myös sellaisia, että for ja for  ; 4) kohta on sellainen, että . Sitten kaava iteratiiviselle approksimaatiolle k :lle voidaan johtaa tangentin geometrisestä merkityksestä seuraavasti:





missä on kaavion  tangenttiviivan kaltevuus pisteessä .

Siksi (oletetaan tangenttiviivan yhtälössä ) halutulla lausekkeella on muoto:

Jos , tätä arvoa voidaan käyttää seuraavana likiarvona .

Jos , niin siellä on "lento" (juuri on lähellä rajaa ). Tässä tapauksessa on välttämätöntä (käyttäen puolitusmenetelmän ideaa ) korvata pisteellä, kunnes piste "palaa" hakualueelle .

Huomautukset. 1) Jatkuvan derivaatan läsnäolo mahdollistaa jatkuvasti muuttuvan tangentin rakentamisen koko ratkaisun etsintäalueelle . 2) Tapauksia, joissa halutun ratkaisun raja (pisteessä tai pisteessä ) on, tarkastellaan samalla tavalla. 3) Geometrialta katsottuna yhtäläisyys tarkoittaa, että kaavion tangentti pisteessä - on yhdensuuntainen akselin kanssa eikä leikkaa sen kanssa lopussa. 4) Mitä suurempi vakio ja pienempi vakio ehtojen kappaleesta 3, sitä lähempänä kaavion tangentin ja pisteen akselin leikkauspiste on, eli sitä lähempänä arvo on haluttua .


Iteratiivinen prosessi alkaa jollain aloituslikiarvolla ja halutun pisteen välissä ei saa olla muita funktion nollia, eli "mitä lähempänä haluttua juuria , sen parempi." Jos etsinnässä ei ole oletuksia , yritys ja erehdys voi kaventaa mahdollisten arvojen aluetta soveltamalla väliarvolausetta .

Ennalta määritetyille , iteratiivinen prosessi päättyy , jos ja . Erityisesti näyttömatriisille ja voidaan laskea kaavion näyttöasteikon perusteella, eli jos ja putoavat yhteen pystysuoraan ja yhteen vaakariviin.

Algoritmi

  1. Alkuperäinen likiarvo on asetettu .
  2. Kunnes pysäytysehto täyttyy, joka voidaan katsoa tai (eli virhe on vaadituissa rajoissa), lasketaan uusi approksimaatio: .

Esimerkki

Harkitse positiivisen löytämisen ongelmaa , jolle . Tämä tehtävä voidaan esittää tehtävänä löytää funktion nollakohta . Meillä on lauseke johdannaiselle . Koska kaikille ja for , on selvää , että ratkaisu on välillä 0 ja 1. Otetaan arvo alkuperäiseksi approksimaatioksi , niin:

Kelvolliset merkitsevät numerot on alleviivattu . Voidaan nähdä, että niiden lukumäärä kasvaa askeleelta askeleelta (noin kaksinkertaistuu jokaisessa vaiheessa): 1 - 2, 2 - 5, 5 - 10, mikä kuvaa neliöllistä lähentymisnopeutta .


Käyttöehdot

Tarkastellaanpa useita esimerkkejä, jotka osoittavat menetelmän puutteita.

Vastaesimerkkejä

Päästää

Sitten

Otetaan nolla alkuperäiseksi approksimaatioksi. Ensimmäinen iteraatio antaa yksikön likimääräisenä. Toinen puolestaan ​​antaa jälleen nollan. Menetelmä kiertää, eikä ratkaisua löydy. Yleisesti ottaen approksimaatiosarjan rakentaminen voi olla hyvin hämmentävää .

Harkitse toimintoa:

Silloin ja kaikkialla paitsi 0.

Juuren läheisyydessä derivaatta vaihtaa merkkiä lähestyessään nollaa oikealta tai vasemmalta. Vaikka . _

Siten se ei ole rajattu lähellä juurta, ja menetelmä hajoaa, vaikka funktio on kaikkialla differentioituva, sen derivaatta on ei-nolla juuressa, äärettömästi differentioituva kaikkialla paitsi juuresta ja sen derivaatta on rajattu juuren ympärille. .

Harkitse esimerkkiä:

Sitten ja paitsi silloin, kun sitä ei ole määritelty.

Seuraavassa vaiheessa meillä on :

Tuloksena olevan sekvenssin konvergenssinopeus on noin 4/3. Tämä on huomattavasti pienempi kuin 2, mikä on välttämätöntä neliöllisen konvergenssin kannalta, joten tässä tapauksessa voidaan puhua vain lineaarisesta konvergenssista, vaikka funktio on jatkuvasti differentioituva kaikkialla , derivaatta juuressa ei ole nolla ja on äärettömästi differentioituva kaikkialla paitsi juurella.

Päästää

Silloin ja sieltä . Siten menetelmän konvergenssi ei ole neliöllinen, vaan lineaarinen, vaikka funktio on äärettömästi differentioituva kaikkialla.

Rajoitukset

Olkoon yhtälö , missä ja sen ratkaisu on löydettävä.

Alla on päälauseen muotoilu, jonka avulla voimme antaa selkeät sovellettavuuden ehdot. Se kantaa Neuvostoliiton matemaatikon ja taloustieteilijän Leonid Vitalievich Kantorovich ( 1912-1986 ) nimeä .

Kantorovichin lause.

Jos on vakioita , kuten:

  1. on , eli se on olemassa eikä ole yhtä suuri kuin nolla;
  2. on , eli rajoitettu;
  3. päällä ja ;

Lisäksi tarkasteltavan segmentin pituus . Sitten seuraavat väitteet pitävät paikkansa:

  1. yhtälöllä on juuri ;
  2. jos , niin iteratiivinen sekvenssi konvergoi tähän juureen: ;
  3. virhe voidaan arvioida kaavalla .

Erityisesti lauseen viimeisestä lauseesta menetelmän neliöllinen konvergenssi seuraa:

Sitten alkuperäisen funktion rajoitukset näyttävät tältä:

  1. toimintoa on rajoitettava;
  2. funktion on oltava tasainen , kahdesti differentioituva ;
  3. sen ensimmäinen derivaatta erotetaan tasaisesti nollasta;
  4. sen toisen derivaatan on oltava tasaisesti rajattu.

Historiallinen tausta

Isaac Newton kuvasi menetelmän Barrowille vuonna 1669 osoittamassaan käsikirjoituksessa On the Analysis by Equations of Infinite Series ( latinaksi  De analysi per aequationes numero terminorum infinitas ) ja teoksessa The Method of Fluxions and Infinite Series ( latinaksi: De metodis fluxionum ) et serierum infinitarum" ) tai " Analyyttinen geometria " ( lat. "Geometria analytica" ) Newtonin teosten kokoelmissa, joka kirjoitettiin vuonna 1671 . Kirjoituksissaan Newton esittelee käsitteitä, kuten funktion laajentaminen sarjaksi , infinitesimaalit ja fluxions ( johdannaiset nykyisessä merkityksessä). Nämä teokset julkaistiin paljon myöhemmin: ensimmäinen julkaistiin vuonna 1711 William Johnsonin ansiosta, toisen julkaisi John Colzon vuonna 1736 luojan kuoleman jälkeen. Menetelmän kuvaus poikkesi kuitenkin merkittävästi hänen nykyisestä esityksestään: Newton sovelsi menetelmäään yksinomaan polynomeihin . Hän ei laskenut peräkkäisiä approksimaatioita , vaan polynomien sarjaa ja sai tuloksena likimääräisen ratkaisun .   

Menetelmä julkaistiin ensimmäisen kerran John Wallisin tutkielmassa "Algebra" vuonna 1685, jonka pyynnöstä Newton itse kuvaili sitä lyhyesti. Vuonna 1690 Joseph Raphson julkaisi yksinkertaistetun kuvauksen kirjassaan "Analysis aequationum universalis" ( latinaksi:  "Analysis aequationum universalis" ). Raphson piti Newtonin menetelmää puhtaasti algebrallisena ja rajoitti sen soveltamisen polynomeihin, mutta hän kuvaili menetelmää peräkkäisillä approksimaatioilla eikä Newtonin käyttämän vaikeammin ymmärrettävän polynomisarjan avulla. Lopuksi, vuonna 1740 Thomas Simpson kuvasi Newtonin menetelmän ensimmäisen kertaluvun iteratiiviseksi menetelmäksi epälineaaristen yhtälöiden ratkaisemiseksi derivaatta käyttäen, kuten tässä esitetään. Samassa julkaisussa Simpson yleisti menetelmän kahden yhtälöjärjestelmän tapaukseen ja totesi, että Newtonin menetelmää voidaan soveltaa myös optimointiongelmiin etsimällä derivaatan tai gradientin nolla .

Vuonna 1879 Arthur Cayley Newton - Fourierin imaginaarisessa ongelmassa huomautti ensimmäisenä vaikeudet yleistää Newtonin menetelmää tapaukseen , jossa polynomien imaginaariset juuret ovat korkeampia kuin toinen ja monimutkaiset alkuperäiset approksimaatiot. Tämä työ tasoitti tietä fraktaaliteorian tutkimukselle .  

Yleistykset ja muutokset

Sekanttimenetelmä

Asiaan liittyvä sekanttimenetelmä on Newtonin "likimääräinen" menetelmä ja välttää derivaatan laskemisen . Johdannan arvo iteratiivisessa kaavassa korvataan sen estimaatilla kahdelle edelliselle iteraatiopisteelle:

.

Siten pääkaavalla on muoto

Tämä menetelmä on samanlainen kuin Newtonin menetelmä, mutta sen konvergenssinopeus on hieman hitaampi. Menetelmän konvergenssijärjestys on yhtä suuri kuin kultainen suhde  - 1,618 ...

Huomautukset. 1) Iteratiivisen prosessin aloittamiseksi tarvitaan kaksi eri arvoa ja . 2) Toisin kuin "todellisessa Newton-menetelmässä" (tangenttimenetelmä), joka vaatii vain tallentamisen (ja tilapäisesti laskelmien aikana ja ), sekanttimenetelmä vaatii tallentamisen , , , . 3) Sitä käytetään, jos laskenta on vaikeaa (esimerkiksi se vaatii paljon koneresursseja: aikaa ja/tai muistia).

Yksi tangenttimenetelmä

Kutsujen määrän vähentämiseksi funktion derivaatan arvoihin käytetään niin sanottua yhden tangentin menetelmää.

Tämän menetelmän iteraatiokaava on:

Menetelmän ydin on laskea derivaatta vain kerran, alkuperäisessä approksimaatiopisteessä ja käyttää sitten tätä arvoa jokaisessa seuraavassa iteraatiossa:

Tällä valinnalla seuraava yhtäläisyys pätee pisteessä :

ja jos segmentti, jossa oletetaan juuren olemassaoloa ja valitaan alkuperäinen approksimaatio , on riittävän pieni ja derivaatta on jatkuva, niin arvo ei poikkea paljoakaan ja siksi kuvaaja kulkee melkein vaakasuoraan leikkaaen suora viiva , joka puolestaan ​​varmistaa approksimaatiopisteiden sarjan nopean lähentymisen juureen.

Tämä menetelmä on yksinkertaisen iterointimenetelmän erikoistapaus . Sillä on lineaarinen konvergenssijärjestys.

Moniulotteinen tapaus

Yleistetään saatu tulos moniulotteiseksi tapaukseksi.

On tarpeen löytää ratkaisu järjestelmään:

Kun valitaan jokin alkuarvo , peräkkäiset approksimaatiot löydetään ratkaisemalla yhtälöjärjestelmiä :

missä .


Sovelletaan optimointiongelmiin

Olkoon tarpeen löytää usean muuttujan funktion minimi . Tämä tehtävä vastaa gradientin nollakohdan löytämisen ongelmaa . Sovelletaan yllä olevaa Newtonin menetelmää:

missä  on funktion Hessiankielinen .

Kätevämmässä iteratiivisessa muodossa tämä lauseke näyttää tältä:

On huomattava, että neliöfunktion tapauksessa Newtonin menetelmä löytää ääripään yhdessä iteraatiossa.

Hessenin matriisin löytäminen on laskennallisesti kallista eikä useinkaan mahdollista. Tällaisissa tapauksissa vaihtoehtona voivat toimia kvasi-newtonilaiset menetelmät , joissa Hessenin matriisin approksimaatio rakennetaan funktion kaarevuuden tiedon keräämiseen.

Newton-Raphsonin menetelmä

Newton-Raphsonin menetelmä on parannus edellä kuvattuun Newtonin ääripäämenetelmään. Suurin ero on, että seuraavassa iteraatiossa yksi yksiulotteisen optimoinnin menetelmistä valitsee optimaalisen vaiheen:

jossa Laskelmien optimoimiseksi käytetään seuraavaa parannusta: sen sijaan, että laskemme uudelleen tavoitefunktion Hessenin jokaisessa iteraatiossa , rajoitamme alkuperäiseen approksimaatioon ja päivitämme sen vain kerran vaiheittain tai emme päivitä sitä ollenkaan.

Sovelletaan pienimmän neliösumman tehtävissä

Käytännössä on usein tehtäviä, joissa joudutaan säätämään kohteen vapaita parametreja tai sovittamaan matemaattinen malli todelliseen dataan. Näissä tapauksissa esiintyy pienimmän neliösumman ongelmia :

Näille ongelmille on ominaista erityinen gradientti ja Hessenin matriisi :

missä  on vektorifunktion Jacobi-matriisi ,  on sen komponentin Hessen-matriisi .

Sitten seuraava vaihe määritetään järjestelmästä:

Gauss-Newtonin menetelmä

Gauss-Newtonin menetelmä perustuu oletukseen, että termi hallitsee . Tämä vaatimus ei täyty, jos minimijäännökset ovat suuria, eli jos normi on verrattavissa matriisin maksimiominaisarvoon . Muuten voit kirjoittaa:

Siten, kun normi on lähellä nollaa ja matriisilla on täysi sarakejärjestys , askel poikkeaa vain vähän newtonilaisesta (ottaen huomioon ), ja menetelmällä voidaan saavuttaa neliöllinen konvergenssinopeus, vaikka toisia derivaattoja ei oteta huomioon. tili. Menetelmän parannus on heuristisiin näkökohtiin perustuva Levenberg-Marquardt-algoritmi .

Yleistys kompleksitasoon

Tähän asti menetelmän kuvauksessa on käytetty funktioita, jotka suorittavat kartoituksia todellisten arvojen joukossa . Menetelmää voidaan kuitenkin soveltaa myös kompleksisen muuttujan funktion nollakohdan löytämiseen . Menettelytapa pysyy kuitenkin samana:

Erityisen kiinnostavaa on alkuperäisen approksimation valinta . Ottaen huomioon, että funktiossa voi olla useita nollia, menetelmä voi eri tapauksissa konvergoida eri arvoihin, ja on aivan luonnollista haluta selvittää, mitkä alueet varmistavat konvergenssin tiettyyn juuriin. Tämä kysymys kiinnosti Arthur Cayleyä jo vuonna 1879 , mutta se oli mahdollista ratkaista vasta 1900-luvun 70 - luvulla tietokonetekniikan myötä. Kävi ilmi, että näiden alueiden risteyskohdissa (niitä kutsutaan yleensä vetovoimaalueiksi ) muodostuu niin sanottuja fraktaaleja  - äärettömiä itsekaltaisia ​​geometrisia kuvioita.

Koska Newton sovelsi menetelmäään yksinomaan polynomeihin , tällaisen sovelluksen tuloksena muodostuneet fraktaalit tunnettiin Newtonin fraktaaleina tai Newtonin pooleina .

Toteutus

scala

objekti NewtonMethod { val tarkkuus = 1e-6 @tailrec def -metodi ( x0 : Double , f : Double => Double , dfdx : Double => Double , e : Double ): Double = { val x1 = x0 - f ( x0 ) / dfdx ( x0 ) if ( abs ( x1 ) - x0 ) < e ) x1 else - metodi ( x1 , f , dfdx , e ) } def g ( C : Double ) = ( x : Double ) => x * x - C def dgdx ( x : Double ) = 2 * x def sqrt ( x : Double ) = x match { case 0 => 0 case x if ( x < 0 ) => Double . NaN tapaus x if ( x > 0 ) => menetelmä ( x / 2 , g ( x ), dgdx , tarkkuus ) } }

Python

matematiikasta tuonti sin , cos kirjoittamasta tuonti Soitava tuonti unittest _ _ def newton ( f : Kutsuttava [[ float ], float ], f_prime : Kutsuttava [[ float ], float ], x0 : float , eps : float = 1e-7 , kmax : int = 1e3 ) -> float : """ ratkaisee f(x) = 0 Newtonin menetelmällä tarkkuudella eps :param f: f :param f_prime: f' :param x0: aloituspiste :param eps: haluttu tarkkuus :return: f(x) = 0:n juuri """ x , x_edellinen , i = x0 , x0 + 2 * eps , 0 kun taas abs ( x - x_edellinen ) >= eps ja i < kmax : x , x_edellinen , i = x - f ( x ) / f_alkuluku ( x ), x , i + 1 palauta x luokka TestNewton ( yksikkötesti . TestCase ): def testi_0 ( itse ): def f ( x : float ) -> float : paluu x ** 2 - 20 * sin ( x ) def f_prime ( x : float ) -> float : return 2 * x - 20 * cos ( x ) x0 , x_tähti = 2 , 2,7529466338187049383 itse . assertAlmostEqual ( newton ( f , f_prime , x0 ), x_star ) if __name__ == '__main__' : yksikkötesti . tärkein ()

PHP

<?php // PHP 5.4 function newtons_method ( $a = - 1 , $b = 1 , $f = function ( $x ) { paluupow ( $ x , 4 ) - 1 ; }, $johdannainen_f = funktio ( $x ) { paluu 4 * pow ( $x , 3 ); }, $eps = 1E-3 ) { $xa = $a ; $xb = $b ; $iteraatio = 0 ; while ( abs ( $xb ) > $eps ) { $p1 = $f ( $xa ); $q1 = $johdannainen_f ( $xa ); $xa - = $p1 / $q1 ; $xb = $p1 ; ++ $iteraatio ; } palauttaa $xa ; }

Oktaavi

funktio res = nt () eps = 1e-7 ; x0_1 = [ -0,5 , 0,5 ] ; max_iter = 500 ; xopt = uusi (@ resh , eps , max_iter ); xopt-päätefunktio a = uusi ( f , eps, max_iter ) x = -1 ; _ p0 = 1 ; i = 0_ _ while ( abs ( p0 ) > = eps ) [ p1 , q1 ]= f ( x ); x = x - p1 / q1 ; p0 = p1 ; i = i + 1 ; loppu i a = x ; päätefunktiofunktio [p,q] = resh ( x ) % p= -5* x .^5+4*x.^4-12*x.^3+11*x.^2-2*x+1; p = -25 * x .^ 4 + 16 * x .^ 3 - 36 * x . ^ 2 + 22 * ​​× - 2 ; q = -100 * x .^ 3 + 48 * x . ^ 2 - 72 * x + 22 ; lopputoiminto

Delphi

// laskettu funktiofunktio fx ( x : Double ) : Double ; alkaa Tulos := x * x - 17 ; loppu ; // f(x)-funktion johdettu funktio dfx ( x : Double ) : Double ; aloita Tulos := 2 * x ; loppu ; funktio ratkaista ( fx , dfx : TFunc < Double , Double >; x0 : Double ) : Double ; const eps = 0,000001 ; var x1 : Double ; alkaa x1 := x0 - fx ( x0 ) / dfx ( x0 ) ; // ensimmäinen approksimaatio while ( Abs ( x1 - x0 ) > eps ) alkaa // kunnes saavutetaan tarkkuus 0.000001 x0 : = x1 ; x1 := x1 - fx ( x1 ) / dfx ( x1 ) ; // myöhemmät approksimaatiot loppuvat ; Tulos := x1 ; loppu ; // Kutsu ratkaista ( fx , dfx , 4 ) ;

C++

#include <iostream> #include <math.h> double fx ( double x ) { return x * x - 17 ;} // laskettu funktio double dfx ( double x ) { return 2 * x ;} // funktion derivaatta typedef double ( * funktio )( double x ); // tyyppifunktion määrittäminen double solve ( function fx , function dfx , double x0 , double eps = 1e-8 ) { kaksinkertainen xi = x0 ; //Nykyinen piste i. iteraatiossa while ( fabs ( fx ( xi )) >= eps ) // kunnes saavutetaan tarkkuus 0,00000001 xi = xi - fx ( xi ) / dfx ( xi ); // myöhemmät approksimaatiot return xi ; } int main () { std :: cout << ratkaista ( fx , dfx , 4 ) << std :: endl ; paluu 0 ; }

C

typedef double ( * funktio )( double x ); double TangentsMethod ( function f , function df , double xn , double eps ) { kaksinkertainen x1 = xn - f ( xn ) / df ( xn ); kaksinkertainen x0 = xn ; while ( abs ( x0 - x1 ) > eps ) { x0 = x1 ; x1 = x1 - f ( x1 ) / df ( x1 ); } paluu x1 ; } //Valitse alkuperäinen arvaus xn = OmaFunktio ( A ) * Oma2Johdannainen ( A ) > 0 ? B : A ; double MyFunction ( double x ) { return ( pow ( x , 5 ) - x - 0.2 ); } //Funktioni double MyDivative ( double x ) { return ( 5 * pow ( x , 4 ) - 1 ); } //Ensimmäinen derivaatta double My2Divatiivi ( double x ) { return ( 20 * pow ( x , 3 )); } //Toinen derivaatta //Esimerkki funktion kutsumisesta double x = TangentsMethod ( MyFunction , MyDivative , xn , 0.1 )

Haskell

tuonti Data.List ( iterate ' ) main :: IO () main = tulosta $ ratkaista ( \ x -> x * x - 17 ) ( * 2 ) 4 -- Ratkaisutoiminto on universaali kaikille todellisille tyypeille, joiden arvoja voidaan verrata. ratkaise = ratkaise 0,000001 esolve epsilon func deriv x0 = fst . head $ dropWhile pred parit missä pred ( xn , xn1 ) = ( abs $ xn - xn1 ) > epsilon -- Pred-funktio määrittää, onko vaadittu tarkkuus saavutettu. seuraava xn = xn - funktio xn / deriv xn -- Seuraava funktio laskee uuden approksimaation. iters = iterate ' next x0 -- Loputon iteraatioiden luettelo. parit = zip iters ( tail iters ) -- Loputon luettelo iteraatiopareista muodossa: [(x0, x1), (x1, x2) ..].

Kirjallisuus

  • Akulich I. L. Matemaattinen ohjelmointi esimerkeissä ja tehtävissä: Proc. opiskelijatalouden tuki. asiantuntija. yliopistot. - M .  : Higher School, 1986. - 319 s. : sairas. - BBK  22.1 A44 . - UDC  517,8 .
  • Amosov A. A., Dubinsky Yu. A., Kopchenova N. P. Laskennalliset menetelmät insinööreille: Proc. korvaus. - M .  : Korkeakoulu, 1994. - 544 s. : sairas. - BBK  32,97 A62 . - UDC  683.1 . — ISBN 5-06-000625-5 .
  • Bakhvalov N. S., Zhidkov N. P. , Kobelkov G. G. Numeeriset menetelmät. - 8. painos - M .  : Perustiedon laboratorio, 2000.
  • Vavilov S. I. Isaac Newton . - M  .: Toim. Neuvostoliiton tiedeakatemia, 1945.
  • Volkov E. A. Numeeriset menetelmät. - M  .: Fizmatlit, 2003.
  • Gill F., Murray W., Wright M. Käytännön optimointi. Per. englannista. - M  .: Mir, 1985.
  • Korn G., Korn T. Matematiikan käsikirja tutkijoille ja insinööreille. - M  .: Nauka, 1970. - S. 575-576.
  • Korshunov Yu. M., Korshunov Yu. M. Kybernetiikan matemaattiset perusteet. - Energoatomizdat, 1972.
  • Maksimov Yu. A., Filippovskaya EA Algoritmit epälineaarisen ohjelmoinnin ongelmien ratkaisemiseen. - M  .: MEPhI, 1982.
  • Morozov AD Johdatus fraktaalien teoriaan. - MEPhI, 2002.

Katso myös

Linkit