NUMEERISET MENETELMÄT JA C-KIELI

Save this PDF as:
 WORD  PNG  TXT  JPG

Koko: px
Aloita esitys sivulta:

Download "NUMEERISET MENETELMÄT JA C-KIELI"

Transkriptio

1 ¾¼¼¹½¾¹ ¼ NUMEERISET MENETELMÄT JA C-KIELI Kevät 2010 Matematiikan ja tilastotieteen laitos, Helsingin yliopisto Matti Vuorinen Luennot: Ñ ½¹½ Ø ¹½¼ Harjoitukset: Ø ½¼¹½¾ ÅÖÓÐÙÓ Matti Vuorinen, Kurssin kotisivu: ¼

2 JOHDANTO ÌĐÑĐÒ ÙÖ Ò ÔĐĐØÚÓØØÒ ÓÒ ÖÒÒÙØØ Ó ÐÐ ØÙØ ĐÝع ØĐÑĐĐÒ» ¹ÓÐÑÓÒØÐĐ ÒÙÑÖ Ð ÒÒ º ÄÙÒ¹ ÒÓØ ÔÓÙØÙÚØ ÔĐĐÓ Ò ØÓ Ò (NR) Press et. al: Numerical Recipes in C++ 2nd ed. ÑÖ ÍÒÚº ÈÖ ¾¼¼¾ ÓÒ Ó ÑØÖÐÒ ÓÒ ÑÖ¹ Ö ¹ÊÇź ÌĐÑĐ ÓÐÐ Ò ÒÙÑÖÒ ØÙØ ØØÓÔØØ ÓÒ ÚÙØØÒÙØ ÙÙÖØ ÙÓ ÓØ Ó ÓÓÐØÒ Ú ØÚ ÐÔй ÓØ ÙÙÖ Óк ÌĐÒÓÙ ÖÓØØ ØĐÑĐÒ ÑÙÒ ÙÔÐÐ ØÒ ÓÐÑÒ ĐÝØØĐÓĐ ÓÔÔÑØÖÐÒº ÅÖÖ ÙÙ ¾¼¼½ ÙÐ ØØØÒ ¹ÐÒÒ ËÄ ÆÍ ËÒØ ÄÖÖݵ¹Ö ØÓ ÓÒ ĐÝØØĐÓ ÓÒ ÚÔØ ÓÔ¹ ØÙ ØÖÓØÙ Ò Ò º ÆÍ¹Ð Ò Ò Ñ٠غ Ä ÙÖÓØÙ ØÒ ÖØ ÙØ ÚÓ ØĐ ÑÝĐÓ ËÄÒ ÚÙÐÐ Ó ÔØĐĐ ØĐ ÔÖÑÔÒ ÙÒ ÆÊØĐº»¹ÐÒ ÓÔ ÐÙ ÒÒØØ Ó ¹ÐØĐ Ó ÚÒ ÑØÑØÓÒ ÓØØÙÑÒÒ ØÝĐÓÐĐÑĐĐÒ ÓÒ ÓÐÐÙØ ÐÚĐ Ø ÔÖÑÔ ÙÒ Ó ÑØØÓÑÒ ÆÊÒ ËÄÒ ÚÙÐÐ ÓÔØÒ ÑØÑØØ Ø ÑÐÐÒØÑ Ø ÓÐÑÒ ØÝ ØĐ ØÚÐÐ Ó ÓÒ ÇË ÍÆÁ¹ÝØÒ ÓÔÚ ÑĐ Ó ÒĐÒ Đ ÓÒ ÝĐÓÝÐÐ ØĐ ¹ÐÐÐ ÓÒ ĐÝØØĐÓĐ ÙÖ Ò ĐÐÒÒº ÃÙÖ Ò ÛÛÛ¹ ÚÙÐÐ ØÙÐÚØ ÚÓØØÒ Ð ÙÖÓØÙ ØØĐÚĐØ ÙÖ ØÓØØØ ÑÐÐÖØ ÙØ Òº Ä ÙÖÓØÙ ØØĐÚĐÒ ÚÓ ÑÓ¹ Ò Ø ÖØ Ø ÑÙÓÑÐÐ ÐÙÒØÓÒ ÑÖÓÐѺ ÃĐÝØĐÑÑ ÐĐÒÒĐ Æ͹ĐĐÒØĐĐ» ÄÒÙܵº ÃĐÝÖÒ ÔÒØÓÒ ÔÖØÓÓÒ ĐÝØĐÑÑ ÒÙÔÐÓعÙÐ ÓÐѺ ÀÐ Ò ½º½º ¾¼½¼ ÅØØ ÎÙÓÖÒÒ ½

3 Sisältö Johdanto 1 1 KOKEELLINEN NUMERIIKKA JA C-KIELI 4 2 LINEAARISET YHTÄLÖRYHMÄT 85 3 INTERPOLOINTI JA EKSTRAPOLOINTI NUMEERINEN INTEGROINTI FUNKTIOIDEN APPROKSIMOINTI ERIKOISFUNKTIOT SATUNNAISLUVUISTA LAJITTELUMENETELMISTÄ EPÄLINEAARISET YHTÄLÖRYHMÄT MINIMOINTI JA MAKSIMOINTI OMINAISARVOT FOURIER-MUUNNOS DATAN TILASTOLLINEN ANALYYSI DATAN MALLINTAMINEN TAVALLISET DIFFERENTIAALIYHTÄLÖT REUNA-ARVOTEHTÄVÄT DIFFERENSSIMENETELMISTÄ 318 ¾

4 18 MINIMOINTI LISÄYKSIÄ 340 ÌĐÑĐ ÓØØÐÙ ÓÒ ÆÊÒ ÑÙÒÒº Ç ÐÙÙÒ ½½¹½ ÑØÖ¹ Ð Ø ÚÓ ĐĐĐ ÔÓ ÐÙØØÐÓ ÓÒ ÐÙ ØÚº Huom. ÄÙÒØÓÒ Ó Ò ÓÐÚØ» ¹ÓÐÑØ ÓÒ Ø ØØØÙ ¹ ĐĐÒØĐĐÐÐĐ ÒÙÔÐÓØÐÐ ÄÒÙܹÝÑÔĐÖ ØĐÓ Đ ÙÖÚÐÐ ÚÖ ÓÐÐ gcc version (Ubuntu ubuntu12) G N U P L O T Version 4.2 patchlevel 3 last modified Mar 2008 System: Linux generic ÎÒÓÒ ÙÖ Ò ÛÛÛ¹ ÚÙÐØ ÐĐÓÝØÝÝ ÑÓ¹ÓÐÑ ØØÚ¹ Ò ¹ ÖÔØÒĐº ÒÙÔÐÓØ Ø ÓÒ Úº ¾¼¼ ÐÑ ØÝÒÝØ ÚÖ Ó º¾º ËÄ ØĐ ÓÒ Úº ¾¼¼ ÐÑ ØÝÒÝØ ÚÖ Ó ½º½ º ÆÊÒ ÚÒÑÔ ÚÖ Ó ÓÒ ØÚ Ó ÓØØ ËÄÒ Ó ÐØ ÒÒØØ ĐÝØØĐĐ Û ØĐ ÐĐÓÝØÝÚĐĐ ÑØÖÐ º Ѻ

5 1 KOKEELLINEN NUMERIIKKA JA C-KIELI ÌĐÑĐÒ ÐÙÚÙÒ ØÖÓØÙ Ò ÓÒ ÐÙÓ ÝÐ Ø Ù ÖĐ Ò ÒÙÑÖ¹ Ò ÔÖÙ Ý ÝÑÝ Ò ÒØ ÑÖĐ ¹ÐÒ ĐÝØĐÓ ØĐ ÒÙ¹ ÑÖ ÓÚÐÐÙ º ËÑÐÐ ÖÖØÒ» ßÐÒ ÔÖÙ ¹ ÖÒØØ ØÓ ÐÑĐÐÐĐ ÔØĐÒº Ä Đ ØØÐÑÑ ÑÙÙØÑÒ ÔÙÓÐÑÒ ĐÝØØĐÓĐ ÙØÒ ÙÚÒ ÔÖØÓ ÒÙÔÐÓعÓÐÑÒ ÚÙÐк ÐÙ ÔÖ ÙÓÑÙØÙ Ø ÙÖ ØÙÚ Ø ÖÐÐ ÙÙ Ø Ó¹ ÐÑ ØÓ Øº Ð ÝÒ Ö ÓÒ ÐĐ ÓØÙ ¹ÐÒ ÒÙѹ Ö Ò ÓÚÐÐÙ Òº ÖØÝ Ø Ò Ò ÑÑĐ ØĐ ÐÙÙ ÓÚØ ÖÒÓÑÒÒ ÓØÙ ÆÊ Ò ÚØÚÑÔÒ ÓÐÑÒº ¹ÐÒ Ó ÐØ Ú ØÚ ØÓ ÓÒ Ò º ¹ÐÒ ÒÙÑÖ ÑØÑع Ø ÓÚÐÐÙ Ó Ú Ø ÖÓ Ø ÓÒ ÐØØÙ Ð ÐÙØØÐÓ Ó ÓÒ ØÚÐÐ Ó ÓØØ Ø ftp://ftp.usc.edu/pub/c-numanal/numcomp-free-c.gz º ÃĐ Ö Ë ÓÒ ÖØØĐÒ ÝĐÓÝÐÐÒÒ ÐĐØÓ ÓÐÐ ÐÐ ÒÙ¹ ÑÖÐк ÌÙ ØÖÐÐ ÙÙ Ø ÓÒ ØØÝ ÛÛÛ¹ ÚÙÐÐ ÐØØØÙ ÐÙع ØÐÓ ÓÓÒ ÑÝĐÓ Óº ÚØØÙ Ø Ó ØÙÚغ 1.1. Tiedostojen nimeäminen. ÃÓ ÙÖ ÐÐ ÐÙÓØÚÒ ØÓ ØÓÒ ÑĐĐÖĐ ØØ ÒÓÙ Ø ØÓÒ ÓÒ ØĐÖĐĐ ÓÑ Ù Ý ØÑØع Ø ÓÐÑÓÒØØÓØØÙÑ٠غ ÌÓ ØÓÒ ÒÑĐÑ Đ ÒÒØØ ÒÓÙØØ ÙÖÚ ÚÒĐº ÌÓ ØÓÐÐ ÒÒØÒ ÐÝÝØ ÙÚÚ ÒÑ ÑÖ h011.c Öº ½ ØØĐÚĐÒ ½ ÖØ Ù h011.dat Öº ½ ØØĐÚĐ ½ ØÙÓØØØÙ Ø ÂØÓ ĐÝØØĐĐÒ ÚÒ Ø ØØÓ ØÓº ÃÙÒÒ Ø ØØÓ ØÓÒ ÐÙÙÒ ÐÓÔÔÙÙÒ ÓÐ ÝÝØĐ ÐØØ ØÓ ØÓÒ ÒÑ ÓÐÐÓÒ ØÓ ¹ ØÓÒ ĐÖ ØÝ Ò ÝÐÐĐÔØÓ ÓÒ ÐÔÓÑÔ ÑÖ /* FILE: h011.c begins. */

6 .... tiedoston sis\"alt\"o.. /* FILE: h011.c ends. */ ÎÒ Ì ØÓ ØÓ beg.cpp Ó ÓÒ ÚÐÑÒ ÐÙ»ÐÓÔÔÙ¹ ÓÑÑÒØغ ÂØÓ ÓÒ ÐÔÔÓ ÐØØĐĐ ÑÙÒ ÙÙØÒ ØÓ ¹ ØÓÓÒº /* FILE: beg.cpp begins */ /* FILE: beg.cpp ends */ ÄÑÔ ÑÙÓØÓ ØÓ ØÓ Ø beg.cpp ÓÒ ØĐÑĐÒ ÐÙÚÙÒ ÐÓÔÙ º 1.2. Liukuluvut. ÊÐÐÙÙÒ ØÝ ØØÓÓÒÒ ÑÙ Ø ØÔ¹ ØÙÙ ÓÒ Ø ÓÐÑ Ø ÖÔÔÙÚÐÐ ØÖÙÙÐÐ ÒĐĐÖÐÙÙÒ ÚÙÐк Ö ÒØĐÖ ØÐÑÒ ÚĐÐÒÒ ÓÒÚÖ Ó ÓÒ ØØØÝ ÐÖÒ ÙÖ ÐÐ º ÑÝĐÓ Ë º ½¼½¾ µº ÊÐÐÙÙÒ ØÝ ØĐ ØØÓÓ¹ Ò ÙØ ÙØÒ ÐÙÙÐÙÙ ØÝ ÓØÒ ÔÓÒØ ÖÔÖ Òع ØÓÒµº ÈÖØØ ÐÙÙÐÙÙ ØÝ ÓÒ ÑÒÐÒÒ ÙÒ Ò º ع ØÐÐÒÒ ÑÖÒØĐØÔ Ó Ñ ÐÙÙ ¾¾ ¼¼¼¼¾ ÑÖ¹ ØĐĐÒ ¾¾ ½¼ ¾ ¾ ½¼ ¼¼¼ ¼ ½¼ Ó ÑÖع ÚĐĐ ÒÙÑÖÓµº ÌØÐÐÒÒ ÑÖÒØĐØÔ ÓÓ ØÙÙ ÙÖÚ Ø Ó Ø µ ØÙÑÖ µ ÑÒØ ÚĐÐÐÐĐ ½ ½¼µµ µ ÔÓÒÒØØÓ¹ ØĐ Đ ÑÒØ Ò ÔØÙÙ ÑĐĐÖĐÝØÝÝ ÑÖØ ÚÒ ÒÙÑÖÓÒ ÑÙÒº ÄÙÙÐÙÙ ØÝ Ò ØÖÙÙ ÑĐĐÖĐÝØÝÝ ÑÒØ Ò ÔØÙÙ Ø ÓØÒ ÒĐ ÝÐÒ Đ Ò ÓÒ ÚÖØØĐº ÄÙÙÐÙÙ ÓÒ ÚÒ ĐĐÖÐÐÒÒ ÑĐĐÖĐº ÈÓ ØÚ ØÒ ÐÙÙÐÙÙÒ ÓÙÓ ÓÒ ÙÙÖÒ ÐÙÙÐÙ¹ Ù ÑÝĐÓ ÔÒÒ ÒÓÐÐ ÙÙÖÑÔ ÐÙÙÐÙÙº ÂÓ Ð ÙØÓÑØÙ Ò ØÙÐÓ ÓØ ÐÙÙÐÙÙÐÙÒ ÙÐÓÔÙÓÐÐÐ ÓÙÙØÒ ÚÖØÐÒ¹ Ø Ò ÓØ ÙØ ÙØÒ ÝÐÚÙÓÓ Ø ÐÚÙÓÓ ØÐÒØÒ ÑÙ¹ Òº ÄÙÙÐÙÚÙØ ÚĐØ ÓÐ ÙØÙÒØ Ø Ø ĐĐÖÖÓÒ ÚĐÐÒ ÚÒ Ø ÖÚÓÐØÒ ÔÒØ ÓÚØ ØĐÑÑĐ Đ ÙÒ Ø ÖÚÓÐØÒ ÙÙÖغ ÄÙÙÐÙÙÖØÑØÒ ÙÙÐÙÚØ ÝØÒß ÚĐÒÒÝ ß Óß ÖØÓÐ Ù ÐÓÓ Ø ÚÖØÐÙÓÔÖØÓØ Ñº µ ÖĐĐØ ÑÙÙØ

7 ÖÐÐÙÙÒ ÓÔÖØÓغ ÄÙÙÐÙÙÖØÑØ ÔĐØÚĐØ ÑÒ¹ ÐØ Ø Ð Ù ĐĐÒÒĐÓØ ÙÒ ÖÐÐÙÚÙÐÐ ÓØÒ ÖÐÐÙÙÒ Ð ¹ Ù ĐĐÒØĐÓĐ ÚÓÒ ĐÝØØĐĐ ÙÒÒ ÑÙ ØØÒ ØÝ ØÖÙÙ Ø ÓØÙÚØ ÖÓØ٠غ ÈÖØØÐÐ ÐØ ÒÒÐØ ÓÒ ÙØÒÒ ØĐÖĐĐ ÙÓÑØ ØØĐ ÖĐÒ Ó Ò ÝÒØÝÝ ÖÓº ÇÒ ÝÝØĐ ÚÖÙØÙ ÚÖ¹ Ò ÑѺ ÒÐÝ ÓÑÐÐ Ð ÒÒÒ ØÙÐÓ ĐÐ ÙÒ ÑÓй Ð Ø ÖÝØÝĐ ØÖÔÐÐ Ò ØÓÑÒ ÔÝĐÓÖ ØÝ ÚÖÒ ÚĐÐØØĐÑ º Ѻ Đ ÝØ a= 1/3; b=1.0/3; ÚÓÚØ ØÙÓØØ Ö ÖÚÓØ aðð bððº ÂÓØÒ ÝĐÓÝÐÐ Đ ÚÒĐ ØØĐĐÒ ÑÝĐÓÑÑÒº ÃØØÚ ØØÓÔØØ ÐÙÙÐÙÚÙ Ø ÐĐÓÝØÝÝ Ó ÓØØ Ø º 1.3. Pyöristyksen sivuvaikutuksia. ÊÐÐÙÚÙÐÐ ¼ ÔĐØ µ¾ ÑÜ º ÈÝĐÓÖ ØÝ ÓÐÑÒ ÑÐÒ ÒØ ÐÙÙÐÙ¹ ÚÙÐÐ ¼¾ ¼ ÙÑÑ ½ ¹ ÖÚÓ µ¾ ¼ Ë ÐÙÙÐÙÙÖØÑØ ÚÓ Óй Ð µ¾ ÑÜ ÌĐÑĐÒ ¹ØÓÚÓØÙÒ ÚÙÚÙØÙ Ò ÚĐÐØØĐÑ ÓÒ ÝÝØĐ ĐÝØØĐĐ ÔÖÑÔ Ð ÙØÔ ¾ ½ µº 1.4. Kone epsilon. ÃÙØÒ Ó ÝÐÐĐ Ó ½º¾ ØÓØØÒ ÐÙÙÐÙ¹ Ù ØÝ ÐÐĐ ÖÐÐÙÙ ÚÓÒ ØØĐĐ ÓÒ¹ ØÝ ØĐ ÖÔÔÙÚй Ð ØÖÙÙÐк Æ º ÓÒßÔ ÐÓÒ ÑØØ ØĐØĐ ØÖÙÙØغ ÃÓÒß Ô ÐÓÒ ÑÔ ÓÒ ¾ Ô Ó ¾ Ô ÔĐØ ÐÙÙÐÙÙÖØÑØ ÑÙØØ ¾ Ô ½ ÔĐ Ô ÓÒ ÔÓ ØÚÒÒ ÓÓÒ ÐÙÙ Đ ØÚÐРص ½ /* FILE: mymeps1.cpp begins */ /* g++ mymeps1.cpp -o a -lm Program finds out machine epsilon. CPU dependent machine epsilon can be considered as an estimate of the minimum error made by computer in calculus operations. */ #include <stdlib.h> #include <cstdio> #include <ctime> #include <climits>

8 #include <cmath> #include <values.h> int main() int c = 1, p = 1; float x = 1.0; double xd = 1.0; printf("\n MACHINE EPSILON 1 = "); while (c + pow(2.0, -p) > c) p++; printf(" %16.6E = 2^(-%3d) \n", pow(2, 1 - p), p - 1); p = 1; printf("\n MACHINE EPSILON 2 = "); while (x + (float) pow(2.0, -p) > x) p++; printf(" %16.6E = 2^(-%3d) \n", pow(2.0, 1 - p), p - 1); printf("\n MACHINE EPSILON 3 = "); p = 1; while (xd + pow(2.0, -p) > xd) p++; printf(" %16.6E = 2^(-%3d) \n", pow(2.0, 1 - p), p - 1); printf ("\n FLT_EPSILON = %12.4E, DBL-EPSILON = %12.4E \n", FLT_EPSILON, DBL_EPSILON); printf("\n DBL_MIN = %12.4E DBL_MAX = %12.4E \n", DBL_MIN, DBL_MAX); printf("\n FLT_MIN = %12.4E FLT_MAX = %12.4E \n", FLT_MIN, FLT_MAX); return 0; /* FILE: mymeps1.cpp ends */ /* Output: MACHINE EPSILON 1 = E-19 = 2^(- 63) MACHINE EPSILON 2 = E-19 = 2^(- 63) MACHINE EPSILON 3 = E-19 = 2^(- 63) FLT_EPSILON = E-07, DBL-EPSILON = E-16 DBL_MIN = E-308 DBL_MAX = E+308 FLT_MIN = E-38 FLT_MAX = E+38 */

9 ÇÐÑÒ ĐĐÒÒĐÓ ØÔØÙÙ ÑÖ ÒØÑÐÐ ÓÑÑÒØ ¹ ÓÐÚ ÓÑÒØÓº ÃÓÒßÔ ÐÓÒ ÚÓÒ ÔØĐĐ ÓÒÒÐ Ò ÖÚÓÒ ÐÐ ÙÒ ÙÙÖ Ð ÒÒÒ ÚÖ ÚĐÒØĐĐÒ ÓÒº ÃÓÒßÔ ÐÓÒÒ ÚÙØÙ Ø ÚÓ¹ Ò ÚÒÒÓÐÐ Ø ÑÝĐÓ ØÙÐÙÓÑÐÐ ÙÒØÓØ Ò ¾ Ü Ó ¾ Ü ½ Ò Ò Üµµ Ü ÖÚÓØ ÚĐÐÐÐĐ ¼ ½µ ÅÓÐÑÑØ ÓÚØ ÑØÑع Ø Ø ÒØØ Ø ÒÓÐÐ ÑÙØØ ÒÙÑÖ Ø ÝÒØÝÝ ÐÙÓ ½¼ ½ ÓÐÚ ÔÓѺ ÄÙÓÒÒÓÐÐ Ø Ú ØÚ Ø ØĐ ÚÓÒ ØĐ ÑÓÒÐÐ ÑÙÐÐÒ ¹ÐÒ ØÙÒØÑÐÐ ÙÒØÓÐк ÊÐÐÙÙ ¹ ØØĐĐÒ ¹Ð Đ ØÚÐÐ Ø ØÝÝÔÔĐ float Ø double ÓÐÚÐÐ ÑÙÙØØÙÐк Ä ÒØØÖÙÙ ÔÖÒ double¹øýýôô Đ ÑÙÙØØÙ¹ ĐÝØØØĐ Đ ÑÙØØ ÓÐÑÒ ¹ ØÐÚØÑÙ Ø ÝÐÒ Đ ÚÚغ ÌĐÐÐĐ ÙÖ ÐÐ ĐÝØĐÑÑ ØÙÔĐĐ Đdouble¹ØÝÝÔÔ Đ ÑÙÙع ØÙº 1.5. NRC:n ohjelmat. ÃÖÒ ÆÊ ÐÙ ÚÙÐÐ ½¹¾ ÓÒ ÝĐÓÝй ÐÒÒ Ø Ù ÓÐÑ ÒÓÙØØØÚÒ ÔÖØØ Òº à º ÙÖ ¹ ÑÔÔº ÅÝĐÓ ÙÖ Ò Ð ÙÖÓØÙ ÔÝÖÑÑ ÙÖÑÒ Ö¹ Ò ÙÙÒØÐÒÓ ØĐÐØĐ Ó Òº ÃÖÒ ÓÐÑÒ ÚÓ ÔÖØÒ ÔÖØÝĐ ØÙØÑÐÐ ÓÐÔÓ ÔĐĐÓÐÑ ÚÖغ ÖÐÐ Ø Óصº ÅÐÒ ÓÐÑØ ĐÝØØĐÚĐØ ÓØ ÓØÓ ØÓ nr.h nrutil.hº Ä ÙÖÓØÙ ØØĐÚĐØ ÙÙØ ÑĐĐÖØØÐÝØ ÓÒ Ó ØÖÔÒ ÐØØØÚ ÓÑÒ ÓØ ÓØÓ ØÓÓÒ Ñº lh1.hº ËÒĐ ØÔÙ¹ ØØĐ ØØ ÓÑ ÚÖØÐÑĐ ÙÖ ÐÐ ÒØÝÚÒ ØÓ ØÓÒ ÒÒ ÑÙÙØ ÑÝĐÓ ØÓ ØÓÒѺ ÂÓØØ Ð ÙÖÓØÙ ÑÙÒ Óй ÐÔÓÑÔ ÙÖØ ÖØ Ù ÓÐ ÔÖ Ø ÓÐÐ ÑÙÓÑØØ ÆÊÒ»ËÄÒ ÓØ Ó¹ ØÑ º ØÓ ØÓ Ø ÒÒ ÒÑØĐ Ò ÙÙй ÐÒ Ó ÑÙÙØØ ÒØĐº ÒÖØÒÒ ÑÖ ÆʹÓÐÑÒ ĐÝØĐÓ ØĐ ÓÒ ÙÖÚ ¹ º ÐÐ ÓÐÑÒ Ð ØÙ ØÙÐÓ ØÙ º ÀÙÓÑ ÐÙ»ÐÓÔÙ ÓÐÚØ ÖØÚغ /* FILE: mynrctst.cpp begins */ /* A simple example of how to use NRC programs. */

10 #include <stdlib.h> #include <cstdlib> #include <cstdio> #include "nr.h" #include "nrutil.h" int main() for (int j = 1; j <= 5; j++) double x = 0.2 * j; printf("log(gamma( %6.4f )) = %12.5e \n", x, NR::gammln(x)); return 0; /* FILE: mynrctst.cpp ends */ log(gamma( )) = e+00 log(gamma( )) = e-01 log(gamma( )) = e-01 log(gamma( )) = e-01 log(gamma( )) = e+00 ÍÒÜ ÓÐÑ ÚÓÒ ĐĐÒØĐĐ Ù ÐÐ Ö ØÚÐк ÃÓÒ Ñع ºÑØ ØغРҺ ĐĐÒØĐÑ Ò ÚÓ ØĐ ÙÖÚ Ø g++ -Wall mynrctst.cpp -o a -I/usr/local/numerical-recipes/recipes cpp/utils -L/usr/local/numerical-recipes/recipes cpp -lm -lnr º Ó ØÔØÙÙ ØÚÐÐ Ò ØÔÒ./a º ÂÓØØ ÔØĐĐ ĐĐÒÒĐÓ ÓÑÒ¹ ØÓ ØÖÚØ Ó ÖØ ÖÓØØ Ö Ò ÓÒ ÙÖ Ò ÓÐÑ ¹ ÑÖĐ ÚÖØÒ ØÓØÙØØØÙ ØÝĐÓÐÙ ÑݺÔÔ Ó ÒØ ĐĐÒØĐÐÐ ØÖÚØØÚØ ÔÖÑØÖغ ÇÐÑ ĐĐÒÒØĐĐÒ ÓÑÒÒÓÐÐg++ myc.cpp -o mycº ÃĐÝØØĐÑĐÐÐĐ ÑÝØĐ ÝÐÐĐÓÐÚÒ ÓÐÑÒ ĐĐÒÒĐÓ Ý ÒÖ¹ Ø ØÙÙ ÑÙÓØÓÓÒ./myc mynrstst.cppº 1.6. Ellipsin pinta-ala. ÌÑÑ ÔÒÒ ÓÐÑÒ Ó ÔÝÝØĐĐ ĐÝع ØĐĐÐØĐ ÐÐÔ Ò ÔÙÓÐ ÐØ ÒØ Ú ØÙ ÐÐÔ Ò ÔÒعÐÒº /* FILE: myarea1.cpp begins */

11 /* g++ myarea1.cpp -o a -lm */ /* Area of an ellipse */ #include <cstdio> #include <cmath> #define PI M_PI /* defines PI */ double area(double a, double b) return PI * a * b; int main() double semi1, semi2, ar; double area(double, double); int i, n; printf("how many ellipses? \n"); scanf("%d", &n); for (i = 1; i <= n; i++) printf("ellipse No %2d : semiaxis1 =? \n", i); scanf("%lf", &semi1); printf("ellipse No %2d : semiaxis2 =? \n", i); scanf("%lf", &semi2); ar = area(semi1, semi2); printf("ellipse No %2d : Area = %16.5e\n", i, ar); return 0; /* FILE: myarea1.cpp ends */ ÇÐÑÒ ØÓÑÒØ ÐÒ ÐÙØØÚ ÙÓÖÒ ÓÓ Øº 1.7. C-kielen matemaattisia piirteitä. ÐÐĐ Ó ½º ĐÝØع ØÒ ¹ÐÒ ØÙÒØÑ ÚÓØ Å_ÈÁ Ó ÓÒ Ö¹ØÓ ØÓ math.h cmathµº ÐÐ ÓÒ ÓÙÓ ÐØĐ ÐĐÓÝØÝÚĐ ÑÙØ Ñع ÑØØ ÚÓغ /* Constants rounded for 21 decimals. */ #define M_E #define M_LOG2E #define M_LOG10E #define M_LN #define M_LN ½¼

12 #define M_PI #define M_PI_ #define M_PI_ #define M_1_PI #define M_2_PI #define M_1_SQRTPI #define M_2_SQRTPI #define M_SQRT #define M_SQRT_ ¹ÐÒ ÔÖÙ ØÓ Ø ÐĐÓÝØÝÝ ÑÝĐÓ ÐÙØØÐÓØ ĐÝØØØĐÚ Đ Óй Ú Ø ÑØÑØØ Ø ÙÒØÓ Øº ÌÚÐÐ ÑÑØ ÑØÑØØ Ø ÙÒ¹ ØÓØ ÙØÒ Ò Ó ÜÔ Ò Đ ÒĐÒ ĐĐÒØ ÙÒØÓØ Ò Ó ÐÓ Ò ÓÒ ÑĐĐÖØÐØÝ ØÓ ØÓ math.h cmathµº ËØÙÒÒ ÐÙÙ ÚÓÒ ÒÖÓ ĐÝØØĐÒ ¹ÐÒ ØÙÒÒ ¹ ÐÙÙÒÖØØÓÖ rand()º ËØÙÒÒ ÐÙÙ ĐÝØØĐĐÒ ÔÐÓÒ ÑѺ Ø ØØÒ ØÙÓØØÑ Ò ØĐÐÐĐÒ ÙÖ Ðк ÐÐ ÑÙÙØÑ ÑÖ¹ Đ ØÙÒÒ ÐÙÙÒ ĐÝØĐÓ ØĐº ÆĐ ØĐ Ò ÑÑĐÒÒ ÑÙÐÓ ÒÓ¹ ÔÒØØÓº ÃÓ ØÙÒÒ ÐÙÙÒÖØØÓÖ ØÓÑ ØÖÑÒ Ø¹ Ø ØÙÓØØ ÑÓÐÐ ÐÙ ØÙ ÐÐ ÑØ ØÙÒÒ ÐÙÚÙغ ̹ ÚÐÐ Ø ÐÙØÒ ÙØÒÒ ØÙÒÒ ÐÙÙÒ ÑÙÙØØÙÚÒ ÓÐÑÒ Ö ÓÖÖÓÐк ÐÐÓÐÚ ÓÐÑ ØĐĐÒ ÔĐĐ ØĐĐÒ ÐÙ ØÑÐÐ ØÙÒÒ ÒÖØØÓÖ Ý ØÑÐÐÓ Øº /* FILE: mygenrdm.cpp begins. */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> #include <climits> using namespace std; void Die_Casting() unsigned seed = time(null); /* Generates a seed for the random number ½½

13 generator using the system clock. */ int i, j, freq[10]; srand(seed); /* Initiates the generator */ for (i = 0; i < 10; i++) freq[i] = 0; for (i = 0; i < 40; i++) j = 1 + rand() % 6; printf("%3d", j); if (i == 20) printf("\n"); freq[j]++; printf("\n"); for (i = 1; i <= 6; i++) printf("%2d :", i); for (j = 1; j <= freq[i]; j++) printf("x"); printf("\t : %3d\n", freq[i]); void Normalized_Rdm(int mi, int ma) unsigned seed = time(null); /* This generates a seed for the random number generator using system clock. */ int i, j; srand(seed); /* This initiates the random number generator with the given seed. */ printf("prints normalized random numbers. r=random \n"); printf(" Rint rint in [%3d,%3d] rfloat in [0,1] \n", mi,ma); for (i = 0; i < 6; i++) j = rand(); printf("%12d %3d %20.5f\n", j, (int) (mi + (j * 1.0 / RAND_MAX) * (ma - mi)), (float) ((j * 1.0 / RAND_MAX))); printf("rand_max= %d \n", RAND_MAX); void GenRdm_xyPairs() ½¾

14 /* This program prints (x[i],y[i]) pairs, where x[i] < x[i+1]. Both x and y values are random numbers. */ unsigned seed = time(null); /* This generates a seed for the random number generator using system clock. */ int i; float s = 0.0; /* x-values are accumulated in s */ float x[11], y[11]; for (i = 0; i < 11; i++) x[i] = 0.0; y[i] = 0.0; srand(seed); printf(" i x y \n"); for (i = 0; i < 11; i++) s += rand() * 1.0 / RAND_MAX; x[i] = s; /* This initiates the random number generator with the given seed. */ y[i] = rand() * 1.0 / RAND_MAX; printf("%2d %8.5f %8.5f\n", i, x[i], y[i]); int main() Die_Casting(); Normalized_Rdm(1, 99); GenRdm_xyPairs(); /* FILE: mygenrdm.cpp ends. */ /* Output: :xxxxxxxxxx : 10 2 :xxxxx : 5 3 :xxxxxx : 6 4 :xxxxxxx : 7 5 :xxxxxxx : 7 6 :xxxxx : 5 ½

15 Prints normalized random numbers. r=random Rint rint in [ 1, 99] rfloat in [0,1] RAND_MAX= i x y (...) */ ÐÐĐ ÐÓÖØÑ Ø ØÙÓØØÙØ ØÙÒÒ ÐÙÚÙØ ÚĐØ Đ ÓÐ ¹ ØÙÒÒ ÐÙÙ ØÓÒÒĐĐÓ ÝÝ ØÓÖÒ ÑÐ Đ ÑÙØØ ÙØÒÒ ÖØØĐÚĐÒ ÝÚĐ Ú ØÒ ÒÐÐ ØĐÐÐĐ ÙÖ Ðк 1.8. Syöttö ja tulostus tiedostojen avulla. ÐÐĐ Ó ½º Ó¹ ÐÑ ÔÝÝØĐĐ ĐÝØØĐĐÐØĐ ÝĐÓØØØĐº ÂÓ Ù ÚÓ ÓÐÐ ÙÐÐ Ø ĐÝØØĐĐ ÝĐÓØØÒ»Ø ØÙÐÓ ØÙ Ò ÙÙÐÐÒ ÙÙÒØÑ Ø ØÓ ØÓÒ ÚÙй к ÒÖØ ÑÑÒ ØÔØÙÙ ÙÖÚ Ø myarea1 < myarea1.inp > myarea1.aux, ÓÐÐÓÒ ÝĐÓØ ÐÙØÒ ØÓ ØÓ Ø Ö½ºÒÔ ØÙÐÓ Ø ÖÓØØÒ ØÓ ØÓÓÒ ÑÝÖ½ºÙܺ ÌÓ ØÓ ÑÝÖ½ºÒÔ ÚÓ ÓÐÐ ÙÖÚ ÓÐÐÓÒ ÝÐÐĐÓÐÚ ÓÑÒØÓ ØÙÓØØ ÙÖÚÒ ØÓ ØÓÒ ÑÝÖ½ºÙÜ ½

16 How many ellipses? Ellipse No 1 : semiaxis1 =? Ellipse No 1 : semiaxis2 =? Ellipse No 1 : Area = e+00 Ellipse No 2 : semiaxis1 =? Ellipse No 2 : semiaxis2 =? Ellipse No 2 : Area = e Kirjoittaminen tiedostoon. ÌÖ ØÐÑÑ ØĐÐÐĐ ÙÖ ÐÐ ÔÐĐ ØĐĐÒ Ø ØØÓ ØÓº ËÙÖÚ ÑÖ Ó ÓØØ ÑØÒ ØÓ ØÓÓÒ Ö¹ ÓØØÑÒÒ ØÔØÙÙº ÀÙÓÑ ÔÙØÓ ØÓÒ wrthed.cpp ÑÙÒ¹ ÓØØÓº ÌÓ ØÓÒ ÓØ ÓÒ ÖÓØØÑÒÒ writeheader ÓÒ ÑĐĐÖØÐØÝ ÐÐĐº writeheader ÖÓØØ ÑѺ ÔĐÚĐÑĐĐÖĐÒ ÐÐÓÒÒ Ø¹ Ó ØÓÒ ÐÙÙÒº // FILE: myex.cpp begins #include <cstdlib> #include <iostream> #include <iomanip> #include <fstream> #include <cmath> #include <ctime> #include "wrthed.cpp" using namespace std; const char *tabfile = "myex.dat"; int main() ofstream fp(tabfile); // create myex.dat if (!fp) std::cerr<< "Error in myex.cpp: can t open file."<<endl; exit(1); writeheader(fp, tabfile); for (int i=0;i<=10;i++) fp << 0.1*(double)i <<" "<< sin(i*0.1)<<endl; fp<<"\nfile: "<<tabfile<<" ends."; fp.close(); cout<<"file: myex.dat written."<<endl; return 0; ½

17 // FILE: myex.cpp ends ÇÐÑÒ myex.cpp ØÙÓØØÑ ØÓ ØÓ ÓÒ ÙÖÚ FILE: myex.dat begins. 04- Jan : (...) FILE: myex.dat ends Matemaattinen mallintaminen. ÅØÑØØ ÐÐ ÑÐÐÒØÑ Ð¹ Ð ØÖÓØØÒ ÖÐÑÐÑÒ ÐÑĐÓÒ ÙÚÑ Ø ÐÐ Ñع ÑØØ ÑÙÓÓ Ó Ø ØÖ ØÐØÚØ ÙÙÖØ ÚÓÒ ÖØ ¹ Ø ÓÓ Ø Ø Ø ÐÑĐĐÖĐ Øº Í Ò Ý ÝÑÝ Đ ÓÒ ÑÓÒ¹ ÚÒÒ ÔÖÓ Ó Ó Ò ÓÚØ ÑѺ ÒÙÑÖ Ò ÑÐÐÒ ÑÙÓ¹ Ó ØÑÒÒ ÖØ ÑÒÒº ÌÚÐÐ Ø ÑÐÐ ÙÚ Óº ÐÑĐÓØĐ ÔÙÙØØÐÐ Ø ĐÐØĐĐ Ý ÒÖØ ØÙ º ÆÙÑÖ Ø ÑÐÐ ÑÙÓÓ ØØØ ØĐĐÒ ÐĐ Ò ÖØÓÒØ Ø ÔÔÖÓ ÑÓÒغ ÌĐÐÐĐÓÒ ØÙÚ ÑÙÙØØÙ ÓÖÚØÒ ÖØÐÐĐ ĐĐÖØĐÓÒØĐ ÔÔ¹ ÖÓ ÑÓÒ ĐĐÖÐÐ ÐÐĐ º ËÙÖÚ ÓÒ ÑÙÙØÑ ÚÐ Ú ÑÖ ½µ È ½ ÔÈ Ò½ Ò ÐÑ ÚÓÒ Ð Ê ¾µ µ ½ É ÜµÜ ÐÑ Ò½ ÒÉ ½ ÐÑ È Ô Ô½ Ò½ Ò ÒÈ Ò½ ½ ½ Ò É Ò½ Ò µ Ò Ò È ½ ÚÓÒ Ð ½ ÚÓÒ Ð ÈÖÙ ÑÖ ØÙÚ Ø ÑÐÐ Ø ÓÒ ÖÒØÐÝØĐÐĐÓº Æ ÓÚØ ÖÐ ÐÙÓÒÒÓÒØØÒ ØÒÒ ÓÚÐÐÙ ÚÖ Ò Ø¹ ÚÐÐ º ÆÒ ÚÙÐÐ ÚÓÒ ÑÐÐÒØ ÑѺ ÑÓÒ Ý Ò ¹ ÑÒ ÐÑĐÓØĐ ØØÓÐ ØĐ ÖÓØÚ Ò ÓÑ Òº ¹ ÖÒØÐÝØĐÐĐÓÒ ÒÙÑÖÒÒ ÖØ Ù ÔÙÓÐ ØÒ ØÔØÙÙ ÖРй ½

18 Ð ØÖÓØÙ Ò ØØÝÐÐĐ ÖØÓÒØÑÒØØÐÝÐÐĐº ÖĐ Ò Ñ¹ ÑĐ Đ ÑÒØÐÑĐ ÓÐ ÖÒØÐÝØĐÐĐÓÒ ÙÖ Ø ØÙØØÙ Ù¹ ÐÖÒ ÑÒØÐÑĐ Ó ÒÝÝĐĐÒ ÓÒ ÓÖÚØØÙ ÔÐÓÒ ØÓÑÑÐÐ ÑÒØÐÑÐÐĐº Virhelähteistä. ÆÙÑÖ Ò Ð ÒÒÒ ÚÖØ ÓØÙÚØ Ù Ò ÖÐ Ò ÚÖØĐÒ ÝØ ÚÙØÙ Ø ÓØ ÒÝØ ØÖ ØÐÑѺ ½µ ÅÐÐÚÖØ ËÝÝ Ý ÒÖØ ØÚØ ÓÐØ٠غ ¾µ ÅÒØÐÑĐÚÖØ ËÝÝ ÒÙÑÖÒÒ ÑÐÐ ÖØ ØÒ ĐĐÖй Ð ÐÐĐ ÑĐĐÖĐÐÐĐ Ð ÙØÓÑØÙ ¹Ø ÙÚÖ ÃÓÖÚØÒ ĐĐÖØĐÓÒ ÙÑÑ ĐĐÖÐÐ ÐÐĐ Ü ½È Ü Ò È È Ê Ò¼ Ò Ò ½ ܵ Ü Ò ÙÒ Ê Ò¼ Ò¼ Ò Ò ½ ܵ ÓÒ ÔÒº Ê ¹ ÖØÓÒØÚÖ Ñº ½ È Ü µ ܺ ¼ µ ÄĐØĐÓÖÚÓÚÖØ ÑÖ ÒÐÝ ÓØÚ Ø Óй Ð Ø ÑØØ٠ص ÓÒ ÚÖÐÐÒÒº µ ÈÝĐÓÖ ØÝ ÚÖØ ÆÙÑÖ Ò ÑÐÐÒ ÖØ Ù ÚÓ ĐÐØĐĐ ÙÙÖÒ ÑĐĐÖĐÒ Ð ÙØÓÑØÙ Ó Ø ÙÒ ÚÓ ØÙÓØØ Ó¹ Ò Ø ÖÔÔÙÚÒµ ÚÖÒ µ ÚÖÒ ÙÑÙÐÓØÙÑÒÒ Ð ¹ ÒÒÒ Òº µ ÔĐ ØÐØ ÐÓÖØÑØ ÅÒØÐÑĐÚÖ ÚÓ ÙØÙ ØĐ ØØĐ ĐÝØØĐĐÒ ÔĐ ØÐ ÐÓÖØѺ µ ÁÒÑÐÐ Ø ÚÖØ ÇÐÑÓÒØÚÖØ Ñºµº µ ÂÓ ÒÓÐÐÐÐ ÚÓ ÓØ ÖÚÑØØÓÑÒ ÙÖÙ Ò ÙØÒ ÑÝĐÓ Ð ÒÒÒ Ò ØÔØÙÚ ÐÙÙÐÙÙÐÙÒ ÖÓÒ ÝÐØÝ Ø º Ýй Ø ÐÚÙÓØÓº Suhteellinen ja absoluuttinen virhe. ÎØÓÖÒ Ü Ü ½ Ü Ò µ ¾ Ê Ò ÔÔÖÓ ÑØÓØ ÑÖº Ü Ü ½ Ü Ò µ ¾ Ê Ò º ÔÔÖÓ Ñ¹ ØÓÒ ÚÖ ÓÒ Ú Ü Ü Ø Ü Üµº ÎÖÒ ÒÓÖÑ Ú ÚÓÒ Ð Ö ØÚÓÒ Ú ½ ÑÜÚ ½ Ò ½µ ½

19 Ú ½ Ú ¾ Ò Ú ½ Ò ½ Ú ¾ µ ½¾ ÎÖÖÚÓ Ü Ü Ù Ù ÚÖÖÚÓº ÂÓ Ü ¼ ÒÒ ÙØй Ü Ü ÐÒÒ ÚÖ ÓÒ Ü º ÌÙÐÓ ÓÒ ÐÑ ØÙ Ô± ØÖÙÙÐÐ Ó Ù¹ ØÐÐÒÒ ÚÖ Ô º ½¼¼ ÌÙÐÓ ÓÒ ÐÑ ØÙ ØÖÙÙÐÐ Ó Ü Ü º Merkitsevien numeroiden kumoutuminen. ËÑÒÑÖ ØÒ ÐÙ¹ ÙÒ ÚĐÒÒÝ Ð Ù ÚÓ ØÔØÙ ÑÖØ ÚÒ ÒÙÑÖÓÒ Ù¹ ÑÓÙØÙÑ Ø Ó ÓÐÒÒ Ø ÙÓÒÓÒØ ØÖÙÙØغ ËÙÖÚ ¹ ÑÙÙØÑ ÑÖĐ Ó ÑØÑØØ ÐÐ ÒØØØÐÐĐ ÚÓ¹ Ò ØÓÖÙ ØÖÙÙÒ ÙÓÒÓÒÑ Øº ½µ Ô Ü ¾ ½ ½ ܾ ½ Ô½ Ü ¾ º ÃÙÒ Ü ¼ ÓÒ ĐÐÑÑĐÒÒ ÑÙÓØÓ ÔÖÑÔº ¾µ ØÒ Üµ ÑÙÓØÓ ÔÖÑÔ ÙÒ Ü ¼º µ Ü ¾ Ü ¼ ¼ ¾ ¼ ¼µ Ò Üµ ½ ¾ Ü ½ Ü ½ ¾¼ Ü º ÂĐÐÑÑĐÒÒ Ü ½¾ Ô ¾ ¾ ÀØÐÐ Ø ÙÑÓÙØÙÑ Ø ÚÓ ÒØÝĐ Ó ¾ º Ç Ð ÙØÔ Õ ½ ¾ Ò µô ¾ µ Ü ½ Õ Ü ¾ Õ µ ÈÓ ØÚ ØÒ ÐÙÙÒ ¼ Ü ½ Ü Ò ÝØÒÐ Ù ÓÒ ÙÐÐ Ø ØĐ ÙÙÖÙÙ ĐÖ ØÝ Đ s=0; for (j=1;j<=n;j++) s+=x[j]; µ ÊÐÐÙÙÒ Ü ½ Ò ÚÖÒ ÐÐ Ò ÓÒ Ú ¾ Ò ½ Ò ½ Ò ½ Ü Üµ ¾ Ü ½ Ò Ò Ü ½ ½

20 ÃÖÐÐ ÙÙ ĐÝØØĐĐÒ Ó Ù ÑÝĐÓ ÒÙÑÖ Ò ØÖÓ¹ ØÙ Ò ÙÓÒÓÑÔ ÑÙØØ ÑØÑØØ Ø ÒØØ ØĐ Ú ¾ Ò ½ ¼ Ò ½ Ò ½ Ò Ò ½ Ü µ ¾ ½ Ü ¾ ½ ÐÐĐ ÓÐÚÒ ÑÖÒ ÚØØÒ ÚÓÒ ØÓØ ØØĐ MATEMAATTINEN IDENTITEETTI NUMEERINEN IDENTITEETTI Numeerisen algoritmin stabiilius. Ä ÙØÓÑØÙ Ø ÐÓÖØÑ ÓÒ ÔĐ ØРк ĐÖĐÓÐØ Ðº ÔÒÐØÙÒÒ ÙÒ ØÐ Ò ØÚ ÐÐßÓÒØÓÒµ Ó ÔÒØ ÚÖØ ÐĐØĐÓØÓ ÚÙØØÚØ ÑÖ¹ ØØĐÚĐ Ø ÐÓÔÔÙØÙÐÓ Òº ÅÙÙÐÐÓÒ Ð ÙØÓÑØÙ Ø ÐÓÖØÑ ÓÒ ØРк ÝÚĐÒÐØÙÒÒ Øеº ÈÖÙ ÑÖ ÔĐ ØÐ Ø ÓÒÐÑ Ø ÓÒ ÝØĐÐĐÓÖÝÑĐÒ Ü Ñ Đ ÓÒ Ò Ò ÑØÖ ÖØ ÑÒÒ ÙÒ ÓÒ ÙÓÒÓº ¹ Đ ØØÒÒ ÖØ Ù ÝÐÒ Đ ÓÐ ÑÓÐÐ Ø Ó Ø µ ¼ ØĐÐÐ Ø ÒÙÐÖ Øµ ÑØÖ Ø ÓÚØ ØĐ Đ ÑÐ Đ ÙÓÒÓ¹ º ÅÙØØ ÑÝĐÓ ØÔÙ Ø µ ¼ ÚÓ ÑØÖ ÓÐÐ ÙÓ¹ ÒÓº ÆÐĐÓÑØÖ Ò ĐÖĐÓÐØØÙØØ ÚÓÒ ÚÒØØØÚ Ø ÑØØ Ò º ÙÒØÓ ÙÙ ÐÙÚÙÐк ÃÙÒØÓ ÙÙ ÐÙÚÙÒ ÙÙÖÙÙ ½µ ÓÒ ÔÖÑÔ ÚÒØØØÚÒÒ ÑØØ ĐÖĐÓÐØØÙÐÐ ÙÒ Ø µ Esimerkki. ËÙÓÖÒ Ý Ü Æ ½¼ Ô Ô ¾ Ý ½ ÆµÜ ½ ÐÙ Ô Ø ÓÒ ½ Æ ½ µº Ë ØØĐÚĐ ÓÒ ÔĐ Øк ËÙÓÖÒ Æ Ý Ü Æ ½¼ Ô Ô ¾ Ý ½ ÆµÜ ½ ÐÙ Ô Ø ÓÒ ½ ¾ Æ ½ ¾ Æ µº Ë ØĐÑĐ ØØĐÚĐ ÓÒ Øк Kuvaajan piirto ASCII-merkein. ÇÔÔÖÑÑ ÆÊ ØÖÓ Ó¹ ÐÑÒ scrsho.cpp ÙÚÒ ÑÓØØÐÑ ËÁÁ¹ÑÖÒº ½

21 ÇÐÑÒ ÚÙÐÐ ÔÖÖĐÑÑ ÙÒØÓÒ Ý ØÒ Ò Üµ Ó Üµµ Ù¹ ÚÒº ÒÒÑÑ Đ ÝÒ./myc myascplt.cpp Ñ Đ myascplt.cpp ÓÒ ÙÖÚ ÓÐÑ /* FILE: myascplt.cpp begins */ /* Plots a function with ASCII characters */ /* Modified from xscrsho.cpp/nr for NRC02 */ #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include "nr.h" double fx(const double x) return tan(sin(x) + cos(x)); int main() NR::scrsho(fx); return 0; /* FILE: myascplt.cpp ends */ ÑÐÐ ÓÐÑÒ ÑÑ ÙÖÚÒ ÙÚÒ Enter x1 x2 (x1=x2 to stop): 6.29 l x l l x l l x l l x l l x l l l l x x l l x l l x x l l xx xx x x xxx xx xxlxx xx xx xxx l l xx xx xx xx l ¾¼

22 l x x x x l l x x l l x x x l l x x l l x l l x x l l x x l l xx xx l -4 6 Enter x1 x2 (x1=x2 to stop): Käyrien ja pintojen piirto gnuplotilla. ÐÐĐ ØÐØÝ ÙÚÒ ÔÖØÓØÔ ÓÚÐØÙÙ ØÐÒØ Ò Ó ÖØØĐĐ ÙÚÒ Ö ¹ ÑÓØØÐÙº ÅÒØØÐÝ ÓÒ ĐÝØØØĐÚ Đ ĐÝØØĐÓÝÑÔĐÖ ØĐÓ Đ ÔĐĐØØÝÝÔ Đº ÅÖØØĐÚĐ Ø ÔÖÑÔ ÙÚ Ò ÙÐ Ó¹ ÐÑÐÐ ÒÙÔÐÓØ ÓÐÐ ÚÓÒ ÔÖØĐĐ ĐÝÖĐ ÔÒØÓº ÒÙÔÐÓØ ÓÒ ÒÒØØÙ ÑѺ ÅØÑØÒ ÐØÓ Ò Ù Ò ÑÖÓÒ ÑÝĐÓ ÐÓÔ ØÓÒ ÌÃ¹Ó ØÓÒ ÐØØ Ò ÐĐÓÝØÝÝ ÑÝĐÓ ÊÀØ ÄÒÙܹ ÒÒÙ ÖÓÑÔÙÐغ ÈÖØÓ ØÔØÙÙ Ú º Ò Ò ÙÒØÓ ØÙÐÙÓÒ ÖÓØØÑÐÐ ÐÙÙÔÖØ Ü Ý ÖÚØØĐÒ ØÓ ØÓÓÒ ØÑԺغ ËÒ ĐÐÒ ĐÝÒÒ ØØĐĐÒ ÒÙÔÐÓØ ĐÝØØĐÓĐÖ ØÐÑĐÒ ÓÑÒÒÓÐÐ gnuplot ÔÖÖØĐĐÒ ÙÚ ÒÙÔÐÓØÒ Đ ÝÐÐĐ plot tmp.dat º ÒÙÔÐÓØÒ ĐÝØĐÓÒ ÐÔÓØØÑ ¹ÐÒ ĐÐØĐ ÓÒ ÙÖ ÚÖØÒ ØØÝ ÓÐÑ gnuplt1.c Ó ÓÒ ØÚ Ñ ØÓ /pub/nrc02/gnuplot02. ËÐÐĐ ÓÒ ÑÝĐÓ ÑÙØ Ò ÐØØÝÚĐ ÓÐѺ ÇÐÑÒ gnuplt1 ÚÙÐÐ ÚÓÒ ÑÒ ÙÚÒ ÔÖØĐĐ ÒÒØĐĐÒ ÚÒ ÙÒØÓÒ Ù¹ Úغ ÈĐĐÓÐÑ gnuplt1ò ĐÝØØĐÑ ÚÓ ÓÐÐ ÚÔ ÙÖÚ /* FILE: myplt.cpp begins */ /* This program uses "gnuplt1.c" to draw y=cos(x) and y=sin(x^2) in the same picture. You can input the x ranges to the aforementioned functions. It is also shown how the program "plot.c" ¾½

23 can be used for the same purpose. Observe that gnuplt1 generates the picture gnuplt1.ps and that plot generates the picture plot.ps if PRINT is set equal to 1. N.B. this is independent of any libraries */ #include <cstdlib> #include <cstdio> #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> #include <math.h> #define PRINT 1 /* If = 0 then no.ps files! */ using namespace std; #include "gnuplt1.h" #include "plot.h" double f(double x) return sin(x * x); void MyPlot0() const char *fname[5]; fname[0]="z0.dat"; fname[1]="z1.dat"; fname[2]="z2.dat"; FILE *fp; fp=fopen(fname[0],"w"); if (fp!=null) for (int i=0;i<20;i++) fprintf(fp,"%10.4f %10.4f \n",i*0.1, cos(i*0.1)); fclose(fp); fp=fopen(fname[1],"w"); if (fp!=null) for (int i=0;i<30;i++) fprintf(fp,"%10.4f %10.4f \n",i*0.1, f(i*0.1)); ¾¾

24 fclose(fp); plot(fname[0],"b-3", fname[1],"rs2",null); int main() gnuplt1( cos, "cos(x)", 0, f, "f(x)", 2, NULL); MyPlot0(); return 0; /* FILE: myplt.cpp ends */ ÐÐĐ ĐÝØØØÝ ÓÐÑ gnuplt1.c ØÙÐÙÓ ÑÝĐÓ ÔÖÖØØĐÚĐØ ÙÒØÓØ ÖÓØØ ÐÓÔÙ ØÙÐÙÓÒ ØÓ ØÓÓÒº ÐÐ ÓÐÑÒ ØÙÓØØÑ ØÓ ØÓ ØÝÔ ØØØÝÒĐº FILE: z.tmp begins. 31-Dec-2001, 0:58 Output of gnuplt1() tabulation of functions: f0 = cos(x) f1 = f(x) x1 x2 f1 f e e e e e e e e e e e e-02 (... ) e e e e e e e e-01 Minimum of each function: e e e e-01 Maximum of each function: e e e e-01 ¾

25 ½ ¼º ¼º ¼º ¼º¾ ¼ ¹¼º¾ Ó Üµ ܵ ¹¼º ¹¼º ¹¼º ¹½ ¼ ¼º ½ ½º ¾ ¾º ½º ½ ¼º ¼ ¹¼º ¹½ ¹½º ¹¼º ¼ ¼º ½ ½º ¾ ¾º º ÌÙ ÂÒ ¼ ½ ¼ ¾¼¼¾ ÂÓ Ò ØÔÙ gnuplt1 ÚÓ ÒØ ÑÒ ÙÐÑÒ ÙÚÒ ĐĐÒÒĐÓÐÐ ÐÐ ÙÒØÓÐк ÆĐÒ ÚÓ ĐÝĐ ÑÖ Ð¹ ÐÓÒ ÙÒ ØÔ ØØĐ ÓÒ ĐÝØØØĐÚ Đ ÚÒ ÚĐĐÒº ÃÙÐÑÙÙÒ ÓÖÑ ÚÓÒ ÑÙÓØ gnuplt1ò ÒÖÓÑ ØÓ ØÓ gnuplt1.cmd ÓÔÚ Øº ÌÓ ØÓÒ ĐÐØĐÓ ÚÓ ÓÐРѺ ÙÖÚ set grid plot "z1.tmp"title sin(x) with lines lw 1,"z2.tmp"title f(x) with linespoints lw 1 ¾

26 pause -1 set terminal postscript set output "gnuplt1.ps" replot ÃÓÖØÒ ØÓ ØÓ ÙÖÚ Ø set grid plot "z1.tmp"title sin(x) with lines lw 1, "z2.tmp"smooth csplines with lines lw 2, "z2.tmp"with points pt 3 ps 3 pause -1 ÃĐÝÒÒ ØØĐĐÒ gnuplot ÄÒÙÜ ÔÖÓÑÔØ Ø Đ ÝÐÐĐ gnuplot gnuplt1.cmdº ËÐÐÓÒ Ò ÐĐÑÔ ÙÚº ËÙÖÚ ÑÖ ĐÝØØĐĐ Ó ÚÖ Ò ÑÓÒÔÙÓÐ Ø ÆÊ¹Ö ØÓ ÔÖØĐĐ ÙÚÒ Ù Ò ÝÔÖÓÑØÖ Ø ÙÒØÓ Øº ÃÓÑÔй ÐÙÚÙÐÐ Þ ½ ÙÒØÓ ÑĐĐÖØÐÐĐĐÒ ÖÐÐ ¾ ½ Þµ ½ Ò¼ Òµ Òµ Þ Ò ÒµÒ Ñ Đ Òµ Ò ½µ ¼µ ½ ÅÓÒØ ÙÒØÓØ ÓÚØ Ò ÖÓ ØÔÙ ÑѺ ¾ ½ Þµ ½ Þµ ØÔÙ ½ Ò ÓѺ Öµ ¾ ½ ½ ½ ¾ Þµ ½Þµ ÐÓ ½ Þµ ÐÐÓÐÚÒ ÓÐÑÒ ÚÙÐÐ Ð ØÒ ÙÒØÓÒ Þµ ¾ ½ Þµ ½ Þµ Þ ¾ ½ Þ ½ µ ÖÚÓ ÙÒ µ ½ ½ ½µ ÚÓÒ ØÓØ ÖÚÓØ ÒÓÐÐ ÒĐÒ ¾ ¾ ÔØĐĐÒ ÓÐе ÙÒ Þ ÓÒ ÖÐÒÒ ÚĐÐÐÐĐ ¼ ½µ ÙÖÚÒ ÓÐÑÒ mysurf ÚÙÐÐ ÚÓØ Ò ÔÖØĐĐ ÙÒØÓÒ Ü Ýµ ÔÒغµ /* FILE: myhypgeo.cpp begins. */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> ¾

27 #include <string> #include <fstream> #include <iostream> #include <iomanip> #define PLOT 1 using namespace std; #include "nr.h" #include "matutl02.h" #include "plot.h" int MyPlot(Vec_DP x0,vec_dp y0) int n=x0.size(); const char *fname[10]; fname[0]="z0.dat"; for (int j=0;j<1;j++) ofstream fp(fname[j]); if (fp.fail()) cout << "File "<< fname[j] <<" could not be opened.\n"<<endl; abort(); if (j==0) for (int i=0;i<n;i++) fp<<x0[i]<<" "<<y0[i]<<endl; fp.close(); plot(fname[0],"b-2",null); return 0; DP Tst_2F1_idty(complex <double> a,complex <double> b, complex <double> c,complex <double> z) complex<dp> z1=-z/(1.0-z),q1,q2; q1=nr::hypgeo(a,c-b,c,z1); q2=pow(1.0-z,a)*nr::hypgeo(a,b,c,z); return( abs(q1-q2)); int main(void) ¾

28 DP x,y; Vec_DP xx(31), yy(31); complex<dp> a(0.5,0.0),b(0.5,0.0),c(1.0,0.0); complex<dp> z,q1; cout << fixed << setprecision(6); for (;;) cout << "Input X Y of Complex Argument (or 0 0 to end):" << endl; cin >> x >> y; cout << endl; if ((x == 0.0) && (y == 0.0)) break; z=complex<dp> (x,y); DP t=tst_2f1_idty(a,b,c,z); cout << "Difference =\n"<<endl; cout << setw(11) << t << endl; for (int i=0;i<=30;i++) xx[i]=i*0.03; z=complex<dp> (xx[i],0); q1=nr::hypgeo(a,b,c,z); yy[i]=real(q1); //Tst_2F1_idty(a,b,c,z); MyPlot(xx,yy); return 0; /* FILE: myhypgeo.cpp ends. */ Input X Y of Complex Argument (or 0 0 to end): Difference = e-16 Input X Y of Complex Argument (or 0 0 to end): 0 0 ÐÐĐ ØÐØÝ ÒÙÔÐÓØÒ ĐÝØØĐÓØÔ Ó ØÓÑ ÐÐ ÓÚй ÐÙ ÐÙ ØÓÐÐ ÓÒ ØĐÐÐ ÙÖ ÐÐ ØĐÝ Ò ÖØØĐÚĐº ÛÛÛ¹ ÚÙÒ ÑÖ¹ ¾

29 ÓÐÑÒ ÑÙÒ ÓÒ ÑÝĐÓ Ñº ÓÐÑÒ myplt.cpp. ØØݹ ÒÑÔ ÚÖ Ó mypltavd.cpp Ó ĐÝØØĐĐ Ò ÖØÝ ÔÖØØĐº ÄÒÙܹÝÑÔĐÖ ØĐÓ Đ ÓÒ ÑÓÐÐ Ø ÔÙØÒ ÚÙÐÐ ØÔØÙÚ ĐÝØØĐÓ ÙÓÖÒ ¹ÓÐÑÒ ĐÐØĐ ÑÙØØ ØĐØĐ ÑÑ ØÓ ĐÝØĐº ËÙ¹ ÖÚ ÑÖ ÚÐ ÓÐÑÒ gnusurf.c ĐÝØØĐÓĐ ÔÒÒÒ ÔÖ¹ ØĐÑ º /* FILE: mysurf.cpp begin */ /* This program uses "gnusurf" to draw the function z=x+sin(y) and to calculate its minimum and maximum values. The user enters the x and y ranges to the aforementioned function. */ #include <cstdlib> #include <cstdio> #include <ctime> #include <cmath> #define PRINT 1 #define SCALE 1 // Positive constant "scales" the z-axis #include "gnusurf.h" double f(double x, double y) return sin(x + sin(y)); int main() double xx[] = -5.0, 5.0, yy[] = -5.0, 5.0; gnusurf(f, xx, yy, SCALE, 0, "f(x,y)", "f(x,y)"); return 0; /* FILE: mysurf.cpp end */ ¾

30 f(x,y) ÇÐÑ Ø ØÓ ØÓÒ gnusurf.tmp ÓÓÒ ÖÓØØÒ ÑÝÓ ÙÒØÓÒ ÙÙÖÒ ÔÒÒ ÖÚÓ Ð ØÙ Ô Ø ØĐÓ Đº FILE: gnusurf.tmp begins. 31-Dec-2001, 1:19 f = f(x,y) In the region -2.3 < x < 2.7, -3.4 < y < 3.4 Minimal function value Attained at x = -1.1, y = Maximal function value Attained at x = 1.9, y = -2.8 f = f(x,y) In the region -2.3 < x < 3.4, -3.4 < y < 3.4 Minimal function value e-01 Attained at x = , y = Maximal function value e-01 Attained at x = , y = ËÙÖÚ ÔÖÖĐÑÑ ÙÚÒ ÔÒÒ Ø ÓÐÐ ÓÒ Ñ ÔÐ ÑÒÑĐº /* FILE: mysurf2.cpp begin */ ¾

31 /* For a random integer m in [5,MAX_NR-1] we choose m random points (x[i],y[i]) in (0,1)x(0,1) and define f2(a,b) to be equal to the logarithm of the distance from (a,b) to the set of these m random points. The surface f2 is graphed. It should have m minima! */ #include <cstdlib> #include <cstdio> #include <ctime> #include <cmath> #include <climits> //#define PRINT 0 #define SCALE 1 #define MAX_NR 10 #include "gnusurf.h" float x[max_nr], y[max_nr]; /* Global variables */ double f(double x, double y) return sin(x + sin(y)); double f2(double a, double b) double mi = pow(pow(a - x[0], 2) + pow(b - y[0], 2), 0.5), s = 0.0; for (int i = 1; i < MAX_NR; i++) s = pow(pow(a - x[i], 2) + pow(b - y[i], 2), 0.5); if (s < mi) mi = s; return log(1e-20+mi); /* log(0) is not defined! */ int main() double xx[] = -5.0, 5.0, yy[] = -5.0, 5.0; ¼

32 unsigned seed = time(null); /* This generates a seed for the random number generator using system clock. */ int m, mi = 6, ma = MAX_NR - 1; srand(seed); /* This initiates the random number generator with the given seed. */ m = (int) (mi + (rand() * 1.0 / INT_MAX) * (ma - mi)); /* m is rdm integer in (mi,ma) */ for (int i = 0; i <= MAX_NR - 1; i++) x[i] = (float) ((rand() * 1.0 / INT_MAX)); y[i] = (float) ((rand() * 1.0 / INT_MAX)); if (i > m - 1) x[i] = x[0]; y[i] = x[0]; /* (x[i],y[i]) are random points in (0,1) */ gnusurf(f2, xx, yy, SCALE, 0, "f2(x,y)", "f2(x,y)"); return 0; /* FILE: mysurf2.cpp end */ mypict5.c ÇÐÑ Ø ØÓ ØÓÒ ØÓÒ ÙÙÖÒ ÔÒÒ ÖÚÓº gnusurf.tmp ÓÓÒ ÖÓØØÒ ÙÒ¹ ½

33 FILE: gnusurf.tmp begins. 4-Jan-2002, 21:47 f = f(x,y) In the region < x < , < y < Minimal function value e+00 Attained at x = , y = Maximal function value e-01 Attained at x = , y = Välinpuolitusmenetelmä. ÇÐÓÓÒ Ê ØÙÚ ÙÒ¹ ØÓ ÓÐÐ µ µ ÓÚØ ÖÑÖ Øº ËÐÐÓÒ ÐÐĐ ÓÒ Óº ÚĐÐÐÐĐ ÒÒ Ý ÒÓÐÐÓغ ÇÐØÑÑ ÒÝØ Ð Đ ØØĐ ÙÒØÓÐÐ ÓÒ ØĐ ÑĐÐÐÒ Ý ÒÓÐÐÓØ Ü ¼ ËÐÐÓÒ ÐÖÚÓ Ü ¼ ÐÐ ÚÓÒ ÐĐÓÝØĐĐ ÙÖÚÚÒ ÓÙÐÙÙÖ Ø ØÙÒÒØÙÒ ÚĐÐÒÔÙÓÐØÙ ÑÒØÐÑĐÒ ÚÙÐк ÇÐÓÓÒ µ¾ ÂÓ µ µ ¼ ØØÒ ÐÐ ÖÚÓ¹ º ÂÓ µ µ ¼ ØØÒ ÐÐ ÖÚÓ º ÂÓ Ø µ ÓÒ ÝÐÐÒ ÔÒ ÓÒ ÐĐÓÝØØÝ ÖØØĐÚĐÒ ÝÚĐ ÐÖÚÓ ÒÓÐÐÓÐк ÅÙÙ ØÔÙ ØÓ ØØÒ ØÖØÓØ ÙÙ ÐÐ Ò Ò ÖÚÓÐк ÇÒ ÐÚĐĐ ØØĐ ÑÐÐ ÑÒØÐÑĐÐÐĐ ÚÓÒ Ø Đ ÑÝĐÓ ÝØĐÐĐÓÒ Üµ Ý ÙÙÖ ÒÒØÙÐÐ Ý Ø º ÐĐÓÝØĐĐ ĐĐÒØ ÙÒØÓÒ ÖÚÓº ¹ ØÝ ÓØ ÐÑÒÚĐØ ÐÐÓÐÚ Ø ÓÓ Ø Ó ÙÙÖÒÙÒ Ð Đ ÑÐÐ ÐÓÖØÑÐÐ Ø ØĐĐÒ ØÓÒÒĐĐÓ ÝÝ Ð ÒÒ Ø ØÙØÙÒ ÒÓÖ¹ ÑÐÙÑÒ ÖØÝÑĐÙÒØÓÒ Üµ ĐĐÒØ ÙÒØÓº /* FILE: mybisect.cpp begins */ /* This program computes the inverse function of a given function f, i.e. for a fixed y, solves f(x)=y for x. This algorithm is based on bisection (see D. Yang: C++ and object oriented numeric computing, Springer2001, p.164). */ #include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> ¾

34 #include <iomanip> using namespace std; #include "nr.h" #include "plot.h" double invf(double a, double b, double y, double (*f)(double), double delta, double epsn, int maxit) /* invf returns a value x on the interval (a,b) such that f(x)=y. Based on bisection of the interval (a,b) such that x remains inside. Stopping criterion: iteration stopped when one of the following is satisfied: (1)interval length <delta (2)number of iterations >maxit (3)residual tolerance < epsn NB. c=a+e, e=(b-a)/2 and (a+b)/2 are mathematically equivalent but the former is preferable because of its numerical properties. */ double u = f(a)-y; // fcn value at left pt double e = b - a; // interval length double c = b; for (int k = 1; k <= maxit; k++) // main iteration loop e *= 0.5; // shrink interval by half c = a + e; // update middle pt double w = f(c)-y; // fcn value at middle pt if ((fabs(e) < delta) ( fabs(w) < epsn) (k==maxit)) return c; ((u > 0 && w < 0) (u < 0 && w > 0))? (b = c) : (a = c, u = w); return c; double fb(double x) return (x - exp(-x)); double fc(double x) return (exp(x)); double Phi(double x) /* Phi(t) = P(x <t) with x in N(0,1) */ return 0.5*(1+erff(x/pow(2.0, 0.5)));

35 void Tabulate() double del=1e-15, eps=1e-15; for (int i=1;i<=20;i++) double x=i*0.05; double y=fc(x); double t=invf(-1.0,2.0,y,fc,del,eps, 60); printf("%10.6f %10.6f %10.6f %12.4e \n",x,y,t,t-x); cout<<" p InvPhi(p) Error:"<<endl; for (int i=1;i<20;i++) double y; //=Phi(x); (i>10)?(y=0.9+(i-10)*0.01):y=0.5+(i-1)*0.05; double t=invf(-1.0,8.0,y,phi,del,eps, 200); printf("%10.6f %10.6f %12.4e \n",y,t, Phi(t)-y); cout<<" InvPhi( )= " <<invf(0, 8, ,Phi,del,eps,200)<<endl; int MyPlot(Vec_DP x,vec_dp y) int n=x.size(); const char *fname="a.dat"; ofstream fp(fname); if (fp.fail()) cout << "File "<< fname <<" could not be opened.\n"<<endl; abort(); for (int i=0;i<n;i++) fp<<x[i]<<" "<<y[i]<<endl; fp.close(); plot(fname,"b-4",null); return 0; int main() double epsn=1e-5, delta=epsn, root, y=0.0; root = invf(1e-2, 2.0,y, fb, delta, epsn, 20); cout << "Approximate root of fb()-y=0 by invf() is: " << root << \n ; cout << "Fcn value at approximate root (residual) is:" << fb(root)-y << \n ; Vec_DP x(30),yval(30);

36 for (int i=0;i<30;i++) x[i]=root-1+(2.0/30)*i; yval[i]= fb(x[i]); MyPlot(x,yval); Tabulate(); /* FILE: mybisect.cpp ends */ Sat Jan 05 11:40: Approximate root of fb()-y=0 by invf() is: Fcn value at approximate root (residual) is: e e e-17 (...) e e-16 p InvPhi(p) Error: e e-09 (...) e-09

37 e e-10 InvPhi( )= Kiintopisteiteraatio. ÌÓÒÒ ÖØØĐÒ Ý ÒÖØÒÒ ÑÒØÐÑĐ ÙÙÖÒ Ø Ñ ÓÒ ÒØÓÔ ØØÖØÓº ÇÐÓÓÒ Ê Ê Ø¹ ÙÚ ÙÒØÓ Ü ¼ ¾ Ê ÅĐĐÖØÐÐĐĐÒ Ü Ò ½ Ü Ò µ Ò ¼ ½ ÅÐÐĐ ÓÐÐ ÓÒÓ Ü Ò µ ÙÔÔÒ Æ º ÒÒ ÒØÓÔ ØÐÙ Ò ÒÓÐÐ ÖĐ ÖØØĐÚĐ ØÓ ÓÒ ØØĐ ÓÒ ÓÐÑ ÚÓ Ä ¾ ¼ ½µ ØÒ ØØĐ Ô ØØ Ø ÚØ ÚĐÐÐÐРܵ ݵ ÄÜ Ý ÐÐ Ü Ý ¾ ÂÓÒÓÒ ÖÔ Ø Ü ØÓØÙØØ ÝØĐÐĐÓÒ Üµ Ü ËÙÖÚ ÐÓÖØÑ ĐÝØØĐĐ ØĐØĐ º ÂÓ Ù ÓÒ ÝÝØĐ ÓÒ¹ ÚÖÒ Ò ØÑ ÓÚÐØ ÐÓÖØÑ ÑÙÓØØÙÙÒ ÙÒØÓÓÒ ÓÐÐ ÓÒ Ñ ÙÙÖº /* FILE: myfxit.cpp begins */ /* g++ myfxit.cpp -o a -lm */ /* Fixed point iteration x_n+1=f(x_n) to solve f(x)=x. */ #include <stdlib.h> #include <cstdlib> #include <cstdio> #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> #include <cmath> #include "gnuplt1.h" double f(double x) return pow(1+0.5*pow(x,2.0),-1.0); double idty(double x)

38 return x; int main() double x, y, e, tol = 5.0e-10; int count = 0; printf("enter the starting approximation:"); scanf("%lf", &x); printf("\n"); do y = f(x); e = fabs(x - y); printf("%10.5lf %10.5lf %10.4e\n",x,y,e); x = y; count++; if (count > 60) printf("maximum number of iterates exceeded.\n"); exit(1); while (e > fabs(y) * tol); printf("root= %lf\n", y); printf("iterates required = %d\n", count); gnuplt1(f,"f(x)",4,idty,"id(x)",23, NULL); return 0; /* FILE: myfxit.cpp ends */ Enter the starting approximation: 2 Enter the starting approximation: e e-01 (...) e e e-10 root= iterates required = 30

39 f(x) id(x) Numeerinen integrointi. ÂØÙÚÒ ÙÒØÓÒ Ê ÒØÖÐ Ê ÜµÜ ÚÓÒ ÔÔÖÓ ÑÓ Ù ÐÐ Ö ØÚÓÐк ¹ ÒÖØ ÒØ ÐÒ ĐÝØØĐĐ ÊÑÒÒÒ ÙÑÑ Ê Ò µ È Ò ½ ¼ Ü µ ÓÔ ØÒĐ Ü ¼ Ò ½ Ñ Đ µò ÄĐ ÝØĐ Ý ÒÖØÒÒ ÑÒØÐÑĐ ÓÒ ÔÙÓÐ ÙÙÒÒ Ú Ð ØÖÔع Úµ Ì Ò µ È Ò ½ ¼ Ü µ Ü ½ µµ¾ ÊÑÒÒÒ ÙÑÑ ÑÙÓÓ ØØØ ÙÒØÓØ ÔÔÖÓ ÑÓÒ ÚĐÐÐÐĐ Ü Ü ½ ÚÓ¹ ÖÚÓÐÐ Ü µ ØÖÔØ Ú ÖÚÓÐÐ Ü µ Ü ½ µµ¾ ȹ ÖÑÔ ÔÔÖÓ ÑÓÒØ Ø ØØĐ Đ ÚÓÒ ĐÝØØĐĐ Ú Û ½ Ü µ Û ¾ Ü ½ µ Û Ü ¾ µ ÚĐÐÐÐĐ Ü Ü ¾ Ñ Đ ÖØÓÑØ Û ½ Û ¾ Û ÚÐØÒ ÑĐĐÖĐĐÑĐØØĐÓÑÒ ÖØÓÑÒ ÑÒØÐÑĐÐÐĐ ¾ ¼ ¾ ¼ ½Ü ¾ Û ½ Û ¾ Û µ ¾ ÜÜ ¾ ¾ Û ½ ¼ Û ¾ Û ¾ µ ¾ ¾ ¼ Ü ¾ Ü Û ½ ¼ Û ¾ ¾ Û ¾ µ ¾ µ ¾ Ó Ø Û ½ ½ Û ¾ ¾ Û ½ ÌĐĐÒ ÔÖÙ ØÙÙ ËÑÔ ÓÒÒ Ú ÓØ ÐÐ ÚÖÖØÒ ÓÐÐ Ø ØÖÔØ ÚÒº

40 /* FILE: mynumint.cpp begins. */ /* Compares numerical integration by Simpson s method and */ /* the trapezoid formula. */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include "nr.h" #include "matutl02.h" double c[5]; /* Global variable */ double f(double x) return c[0]*sin(c[1]*x)+ c[2]*2.0*x; double prim_of_f(double x) /* \int_a^b f(x) dx = prim_of_f(b)- prim_of_f(a) */ return -(c[0]/c[1])*cos(c[1]*x)+c[2]*x*x; double trapez(int m, double a, double b, double (*func_ptr) (double )) /* Trapezoidal formula for numerical integration */ double h=(b-a)/m; double s=(*func_ptr)(a)+(*func_ptr)(b); s=-0.5*s; for (int i=0;i<=m;i++) s +=func_ptr(a+i*h); s *= h; return s; double Simpson(int m, double a, double b, double (*func_ptr) ( double)) /* Simpson s formula for numerical integration */ /* m = number of subdivisions (a,b) interval of integration */

41 double h=(b-a)/m; double s=(*func_ptr)(a)+(*func_ptr)(b); for (int i=1;i<=m-1;i++) s += (4.0*(*func_ptr)(a+(i-.5)*h)+ 2.0*(*func_ptr)(a+i*h)); s += (4.0*(*func_ptr)(a+(m-.5)*h)); s *= (h/6.0); return s; void DoTst(int num_subdiv, double a,double b) int m=num_subdiv; double s1,s2,err1,err2; /* function prototype */ double Simpson(int m, double a, double b, double (*func_ptr) (double )); /* definition and initialization */ double (*func_ptr)(double)=f; s1=simpson(m, a, b, func_ptr); s2=trapez(m, a, b, func_ptr); err1= s1-(prim_of_f(b) -prim_of_f(a) ); err2= s2-(prim_of_f(b) -prim_of_f(a) ); printf("% 15.10lf % 8.4e % 15.10lf % 8.4e\n", s1,err1,s2,err2); int main() init_srand(); int num_subdiv=500; double a=0, b=1; printf(" Simpson Error Trapez Error\n"); for (int i=1;i<=5;i++) for (int j=0;j<5;j++) c[j]=rdm(0.5, 2.5); a= rdm(-2, 2.5); b=a+rdm(0.5, 2.5); DoTst(num_subdiv,a,b); /* FILE: mynumint.cpp ends. */ ¼

42 Simpson Error Trapez Error e e e e e e e e e e Suoran sovitus dataan. ÖĐ ÔÖÙ ØØĐÚĐ ØÐ ØÓÐРع ÒÐÝÝ ÓÒ ÓÚØØ ÙÓÖ ØÔ Ø Ò Ü Ý µ ½ Ñ Ü Ü ½ ËÙÖÚ ÓÐÑ Ø ÓÚØÙ Ò ÔÖØĐĐ ØÒ ÓÚØØÙÒ ÙÓÖÒ ÙÚغ /* FILE: mylsq.cpp begins. */ #include <stdlib.h> #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 /* #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> */ #define PRINT 1 using namespace std; #include "nr.h" #include "matutl02.h" #include "plot.h" int MyPlot(Vec_DP x0,vec_dp y0, Vec_DP x1,vec_dp y1, Vec_DP x2,vec_dp y2) /* Plots three curves x0,y0, x1,y1, x2, y2. Here x0, y0 have equal length likewise for x1,y1 and x2,y2. But the lengths of x0 and x1 need not be the same. */ int n0=x0.size(), n1=x1.size(),n2=x2.size(); const char *fname[10]; fname[0]="z0.dat"; fname[1]="z1.dat"; ½

43 fname[2]="z2.dat"; for (int j=0;j<3;j++) ofstream fp(fname[j]); if (fp.fail()) cout << "File "<< fname[j] <<" could not be opened.\n"<<endl; abort(); if (j==0) for (int i=0;i<n0;i++) fp<<x0[i]<<" "<<y0[i]<<endl; if (j==1) for (int i=0;i<n1;i++) fp<<x1[i]<<" "<<y1[i]<<endl; if (j==2) for (int i=0;i<n2;i++) fp<<x2[i]<<" "<<y2[i]<<endl; fp.close(); plot(fname[0],"b-3",fname[1],"r-4",fname[2],"ks3",null); return 0; void LSQcoef(Vec_DP &x, Vec_DP & y, DP &a, DP &b ) /* For given data x, y fits a line a*t + b */ double s1=0.0,s2=0.0,s3=0.0,s4=0.0, s5=0.0, xave; int m=x.size(); for (int i =0;i<m;i++) s1+=x[i]; s2+=y[i]; s3+=x[i]*y[i]; s4+=x[i]*x[i]; s5=0.0; xave=(1.0*s1)/m; for (int i =0;i<m;i++) s5+=pow(abs(x[i]- xave), 2.0); /* The above method for computing s5 is numerically better than the formula s5=s4-(1.0/m)*s1*s1;. Mathematically both are the same. */ if (s5<1e-20) cout<<"data with zero variance in LSQcoef"<<endl; s5=1e-20; a=1.0*(s3-(1.0/m)*s1*s2)/(1.0*s5); ¾

44 /* If you replace above (1.0/m) by (1/m) you will not get the correct result! */ b=(s2-a*s1)/m; int main() int m=21; Vec_DP x(m), y(m), xi(40), yi(40); double a,b; for (int i=0;i<m;i++) x[i]= i*1.0; y[i]= x[i]+ log(1.0+x[i]*x[i]); y[i]= y[i]*( *sin(3*x[i])); LSQcoef(x, y, a, b ); for (int i=0;i<40;i++) xi[i]=i*0.5; yi[i]=a*xi[i] + b; cout<<"a= "<<a<<", b= "<<b<<endl; MyPlot(x,y,xi,yi,x,y); /* FILE: mylsq.cpp ends. */ OUTPUT: a= , b=

45 ¼ ¾ ¾¼ ½ ½¼ ¼ ¹ ¹ ¼ ½¼ ½ ¾¼ ¾ ÌÙ ÂÒ ¼ ½¼ ¾¼¼¾ Monte Carlo-integrointi. ÅÓÒØ ÖÐÓ¹ÒØÖÓÒØ ÓÒ ÒÑØØÝ ÅÓÒÓ Ø ÚÒ ÒÓÒ ÑÙÒº ÄĐØĐÓÓØÒ ÓÒ ÙÓÖÙй ÑÓ ½ ½ ¾ ¾ Ñ Ñ Ø Ú ÔÔÐ Ã ÓÒ ØÐÚÙÙ Ú Ãµ ÐÙØÒ ÑĐĐÖØØĐĐº ÃÔ¹ ÔÐÒ ÑĐĐÖØØÐ Ò ÖØÖ ØÒÒ ÙÒØÓ Ã Üµ Ó Ö¹ ÚÓÒ ½ ÙÒ Ü ¾ à ¼ ÑÙÙÐÐÓÒº ÅÙÓÓ ØÑÑ Ø Ò ÙÑÒ ÑÙÒ Ò Ô ØØØĐ ÙÓÖÙÐÑÓ Ø ÓÐÓÓÒ Ô ÒÒ Ô ØÒ ÐÙÙÑĐĐÖĐ Ó Ã Üµ ÖÚÓÒ ½º ËÐÐÓÒ Ú Ãµ Ô Ò Ú µ ËÙÖÚÐÐ ÓÐÑÐÐ Ð ÑÑ Ý ĐÓÙÙÐÒ ØÐÚÙÙÐРй ÖÚÓ ÚÖØÑÑ ØÙÐÓ Ø ØÖÒ ÖÚÓÓÒº /* FILE: mymoncar.cpp begins. */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream>

46 #include <iomanip> using namespace std; #include "nr.h" #include "matutl02.cpp" long tstres(int Ndim, long howmany) int i=0,count=0; double tmp,tmp2; Vec_DP x(ndim); while (i <=howmany) for (int k=0;k<ndim;k++) x[k]=(float)rdm(0.0, 1.0); if (vnormp(x,2.0)<1.0) count++; // vnormp is part of matutl02.cpp i++; return count; int BallVolume(void) long k, i=0,count =0,np,nrt; double tmp,tmp2; init_srand(); printf( "\n n Expected\n"); for (np=2;np<=8;np++) printf(" %2ld",np); for (nrt=2; nrt<=10;nrt+=2) count=tstres(np,nrt*1000); printf("%8.4f",count*0.001/nrt); tmp=pow(m_pi,0.5*np)/exp(nr::gammln( *np)); printf("%8.4f \n", tmp*pow(2.0,-(double)np)); return 0; int main()

47 BallVolume(); /* FILE: mymoncar.cpp ends. */ /* */ n Expected Eulerin menetelmän epästabiilisuus. ÐÙÖÚÓØØĐÚĐÒ Ý ¼ ½¼¼Ý ½¼¼ Ý ¼µ Ý ¼ ÖØ Ù ÓÒ Ý Øµ Ý ¼ ½µÜÔ ½¼¼ ص ½ ÙÐÖÒ ÑÒØÐÑĐĐ ÒØĐÐÐĐ ÐÔØÙÙÐÐ ÚÓÒ ĐÝØØĐĐ Ò ÖØ ÙÒ ÒÙÑÖ Ò ÔÔÖÓ ÑÓÒØÒ Ü ¼ ¼ Ý ¼ ݼ Ü ½ Ü Ý ½ Ý ½¼¼ ½¼¼ Ý µ ½ ½¼¼ µ Ý ½¼¼ ÂÓ Ý ¼ ¾ ÒÒ ÖØ Ù ÓÒ Ý Øµ ½ ÜÔ ½¼¼ ص ÁÒÙØÓÐÐ ÒĐĐĐÒ ØØĐ Ñº ÙÐÖÒ ÖÙÖ Ó ÓØ ÚÒ Ý Ý ¼ ½µ ½ ½¼¼ µ ½ ËÒĐ ØÔÙ ØØĐ ½ ½¼¼ ÓÒ ÝÐÐÒ ÔÒ ÙÐÖÒ ÑÒØÐÑĐ ÒĐÝØØĐĐ ØÓÑÚÒ ÝÚÒ ÙÒ Ø ÖÚÓÐÐ ¼¼¾ ÚÖÓÚÒº ÌĐÑĐ ÐÑÒ ÑÝĐÓ ÓÐÑÒ ØÙÐÓ Ø٠غ /* FILE: myeuler.cpp begins */ /* g++ -Wall myeuler.cpp -o a */ /* This program demontrates the instability of Euler s method */ #include <cstdio>

48 double myf(double x, double y) return (1.0-y)*100.0; int main(void) double h=0.005, x=0.0,y; printf("instability of Euler s method\n"); for (int j=1;j<=12;j++) x=0.0;y=2.0; h=h+0.005; printf(" \nh= %6.3lf\n \n" " %6s %12s\n",h,"x","y"); while (x<=1.0) x=x+h; y=y+h*myf(x,y); printf("%8.4lf %15.4lf \n",x,y); return 0; /* FILE: myeuler.c ends */ TULOSTUSTA: Instability of Euler s method h= x y (...) h=

49 x y (...) h= x y (...) h= x y (...)

50 h= x y (...) VEKTORIT JA MATRIISIT NRC-ohjelmien käyttöohjeet. ÃÙØÒ ÆÊÒ ÐÓÐÑ ÓØ ÓÒ ÔĐĐÓÐÑ Ó ÑÓ ÐÓÐÑÒ ĐÝØØĐÓĐº ÆĐÑĐ ÔĐĐÓÐÑØ ØĐØ ÓÚØ ÓÓÒÒØ Ö ÆÊ ÜÑÔÐ ÓÓ ÓÒ ÓÔÓ ÓÒ º Ö Ò ÙÖ ÑÔ º ËÑ ÑÔ ÓÒ ÑÝĐÓ ÙÖ ÚÖØÒ ØØÝĐ ÖÐ ÓØ ÑѺ Ö ØÓÒ ÐØÑ Ø ÓØ ÐĐÓÝØÝÚĐØ ÑÝĐÓ ÙÖ Ò ÓØ ÚÙÐغ Vektori ja matriisi tietorakenteina NR:n mukaan. ÎØÓÖ Ñع Ö ÓÒ ÑĐĐÖØÐØÝ Ò ÐÙÓ ÓÒ ÑØÓÒ ÓÚØ ÑÓÒØ ÒÙÑÖ Ò ÐÒÖÐÖÒ ÔÖÙ ÓÔÖØÓغ ÄÙÓÒ ÐÑÒØÝÑĐØ ÑĐĐÖØÐÐĐĐÒ ÙÖÚÒ ØÝÝÐÒº Mat_DP a(5,3); Vec_DP x(3); for (int i=0;i<x.size();i++) x[i]= i*3.2; for (int i=0;i<a.nrows();i++) for (int j=0;j<a.ncols();j++) a[i][j]= 1.0/(i+j+1); cout <<"a= "<<a<<endl; Vec_DP z(5); matvecmul(a,x,z); cout<<"z="<<z<<endl;

51 ËÙÖÚ ÓÒ ÐÙÓÒÒÓ ØÐØÙ ÑØÖ Ò ÑÒÔÙÐÓÒØÒ ÓÚÐØÙ¹ Ú ØÓÑÒØÓ Đ ÒÒØØÙ ÑÖ ÒĐÒ ØÓÑÒØÓÒ ĐÝØĐÓ ØĐ ÔĐĐÓÐÑ myutl4.cppº ÀÙÓÑ ØØĐ ÑÙÒ ÓÒ ØÙÒÒ ÑØÖ ÒÖÓÚ ØÓ¹ ÑÒØÓ ÙØÒ ranmatº ÂÓ Ù ÚÓ ĐÝĐ ÒÒ ØØĐ Ö ÓÖÖÓÐÐ ÒÖÓØÙÙÒ Ñ ØÙÒÒ ÑØÖ º ÂÓ ØĐØĐ ÐÙØ ÔØĐĐ ¹ ØÙÒÒ ÐÙÙÒÖØØÓÖ ĐÝÒÒ ØĐĐ ÙÙÐÐÒº ÌĐÑĐ ØÔØÙÙ Ó¹ ÑÒÒÓÐÐ init srand() Ó ÓÒ ÑĐĐÖØÐØÝ ÙÖ Ò ÛÛÛ¹ ÚÙÐØ ÐĐÓÝØÝÚĐ Đ ØÓ ØÓ matutl02.cppº /* FILE matutl02.cpp begins */ /* Last updated */ /* */ #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> /* get_int prompts the user to enter an integer in the given range [low, up]. */ void get_int(int &m,int low,int up) m=low-1; int count=0; while (((m<low) (m>up))&&(count<3)) cout<< "Please enter integer in [" <<low<<","<< up<<"]: "<<endl; cin>>m; count++; if ((m<low) (m>up)) cout <<"Input failed."<<endl; abort(); /* getfname uses the seed fname to generate a name for a file which does not exist already. */ char *getfname(char *fname) ¼

52 FILE *fp; int count=1; char *name,*beg,*end,*point; name=(char *) malloc(20); beg=(char *) malloc(20); sprintf(name,"%s",fname); sprintf(beg,"%s",fname); point=strchr(beg,. ); if(point!=null) *point= \0 ; end=".dat"; while(!((fp=fopen(name,"r"))==null)) sprintf(name,"%s%d%s",beg,count++,end); fclose(fp); return name; /* init_srand initializes of the random number generator with system clock. */ void init_srand() unsigned seed=time(null); srand(seed); /* rdm produces a random number in the range [low,up]. */ DP rdm(dp low, DP up) DP x=rand(), der=dp( (up - low)/rand_max); return (der*x + low); /* ranmat2 produces a random matrix with entries in the range [low,up]. The space for the matrix must be reserved in advance. */ void ranmat2(mat_dp &a, DP low, DP up) int m= a.nrows(),n=a.ncols(); for (int i = 0; i <= m-1; i++) for (int j = 0; j <= n-1; j++) a[i][j] = rdm(low, up); ½

53 /* entermat prompts the user to enter a matrix entry by entry and displays the input on the screen. Matrix size must be known in advance and the space reserved for the matrix. */ void entermat( Mat_IO_DP &a) for (int j=0;j<a.nrows();j++) for (int k=0;k<a.ncols();k++) cout << "Enter A[" <<j<<","<<k<<"]: "; cin>>a[j][k]; cout << "The input you gave: "<<a[j][k]<<endl; ; /* entermat2 prompts the user to enter a matrix entry by entry and displays the input on the screen. Mat_DP a(1,1); must be defined in the calling program. On return, after the call a=entermat2(); a has the dimensions given. */ Mat_DP entermat2(const int low,const int up) int m,n; cout<<"enter matrix size (m,n):"; get_int(m,low,up); get_int(n,low,up); Mat_DP a(m,n); for (int j=0;j<a.nrows();j++) for (int k=0;k<a.ncols();k++) cout << "Enter A[" <<j<<","<<k<<"]: "; cin>>a[j][k]; cout << "The input you gave: "<<a[j][k]<<endl; ; return a; ¾

54 /* showvec displays a vector on the screen. */ void showvec( Vec_DP &a) cout.precision(8); cout<<endl<<"a vector with "<< a.size()<< " components:" <<endl; for (int j=0;j<a.size();j++) cout <<a[j]<<" "; cout<<endl; /* showmat displays a matrix on the screen. */ void showmat( Mat_DP &a) int m=a.nrows(), n=a.ncols(); cout.precision(8); cout<<endl<< m<< "x" <<n <<" matrix: "<<endl; for (int j=0;j<m;j++) for (int k=0;k<n;k++) cout <<a[j][k]<<" "; if (k==n-1) cout<<endl; /* showmat2 displays a matrix on the screen with a specified format. */ void showmat2( Mat_DP &a, char *fmt) int m=a.nrows(), n=a.ncols(); cout<<endl<< m<< "x" <<n <<" matrix: "<<endl; for (int j=0;j<m;j++) for (int k=0;k<n;k++) printf(fmt,a[j][k]); if (k==n-1) cout<<endl; /* putmat stores a matrix in a file given by fname. Format as in getmat. */ void putmat( Mat_DP &a, char *fname)

55 DP luku=0.0; int m=a.nrows(), n=a.ncols(); ofstream fp(fname); if (fp.fail()) cout << "File "<< fname <<" could not be opened.\n"<<endl; abort(); fp <<m <<" "<<n <<endl; fp.precision(9); fp.width(16); for (int i=0;i<m;i++) for (int j=0;j<n;j++) luku=a[i][j]; fp<<luku<<" "; // cout <<luku<<" "; if (j==n-1)fp<<endl;cout<<endl; cout<<"matrix written in file " <<fname<<endl<<"======="<<endl; fp.close(); /* putmat2 writes a matrix into a file with the name obtained from getfname using the seed tied */ char *putmat2(mat_dp &a,char *tied) FILE *fp; int i,j, m=a.nrows(), n=a.ncols(); char *fname; fname=getfname(tied); if ((fp=fopen(fname,"w"))==null) fprintf(stderr,"cannot open file %s\n",fname); exit(1); fprintf(fp,"%d %d\n",m,n); for (i=0;i<m;i++) for (j=0;j<n;j++) fprintf(fp,"%25.16e ",a[i][j]); fprintf(fp,"\n"); fclose(fp); return fname;

56 /* getmat reads a matrix file stored in this format: Prior to the call of getmat, Mat_DP a(1,1); must be defined in the calling program on return a has the dimensions read from the file. */ Mat_DP getmat(char *fname) int m,n; DP d; ifstream fp(fname); if (fp.fail()) cout << "File "<< fname <<" could not be opened.\n"<<endl; abort(); fp>>m; fp>>n; Mat_DP a(m,n); for (int i=0;i<m;i++) for (int j=0;j<n;j++) fp >> d; a[i][j]=d; fp.close(); return a; /* matmul multiplies two matrices a and b and stores the result in c. */ void matmul(mat_dp &a, Mat_DP &b, Mat_IO_DP &c) int ma=a.nrows(),na=a.ncols(),mb=b.nrows(),nb=b.ncols(); if (na!=mb) cout<<"incompatible matrix dimensions: "<< " na, mb= "<<na<<" "<<mb<<endl; abort();

57 DP s; for (int i=0;i<ma;i++) for (int j=0;j<nb;j++) s=0.0; for (int k=0;k<na;k++) s+=a[i][k]*b[k][j]; c[i][j]=s; /* matsum adds two matrices a and b and stores the result in c. */ void matsum(mat_dp &a, Mat_DP &b, Mat_IO_DP &c) int ma=a.nrows(), na=a.ncols(), mb=b.nrows(), nb=b.ncols(); if ((ma!=mb) ( na!=nb)) cout<<"incompatible matrix dimensions: " <<" ma, na= "<<ma<<" "<<na <<" mb, nb= "<<mb<<" "<<nb <<endl; abort(); for (int i=0;i<ma;i++) for (int j=0;j<na;j++) c[i][j]=a[i][j]+b[i][j]; /* scalmatmul multiplies a matrix a by s and stores result in b. */ void scalmatmul(mat_dp &a, DP s,mat_dp &b) int ma=a.nrows(), na=a.ncols(); for (int i=0;i<ma;i++) for (int j=0;j<na;j++) b[i][j]=s*a[i][j];

58 /* scalmatsum adds a scalar to a matrix a by s and stores result in b. */ void scalmatsum(mat_dp &a, DP s,mat_dp &b) int ma=a.nrows(), na=a.ncols(); for (int i=0;i<ma;i++) for (int j=0;j<na;j++) b[i][j]=s+a[i][j]; /* matvecmul multiplies a matrix a by a vector v and stores result in b. */ void matvecmul(mat_dp &a, Vec_DP &v,vec_dp &b) int ma=a.nrows(), na=a.ncols(), nv=v.size(), nb=b.size(); DP s=0.0; if ((na!=nv) (ma!= nb)) cout<<"incompatible factors, ma,na,nv, nb =" <<ma<<", "<<na<<", "<<nv<<nb<<", "<<nb<<endl; abort(); for (int i=0;i<ma;i++) s=0.0; for (int j=0;j<na;j++) s+=a[i][j]*v[j]; b[i]=s; /* vecmatmul multiplies a vector by a matrix and stores result in b. */ void vecmatmul(vec_dp &v,mat_dp &a, Vec_DP &b) int ma=a.nrows(), na=a.ncols(), nv=v.size(), nb=b.size(); DP s=0.0;

59 if ((na!=nb) (ma!= nv)) cout<<"incompatible factors in vecmatmul, ma,na,nv, nb =" <<ma<<", "<<na<<", "<<nv<<nb<<", "<<nb<<endl; abort(); for (int i=0;i<b.size();i++) s=0.0; for (int j=0;j<na;j++) s+=a[j][i]*v[j]; b[i]=s; /* mnormp returns matrix norm: (Sum_i,j a(i,j) ^p)^1/p */ DP mnormp(mat_dp &a, DP p) DP s=0.0; int m= a.nrows(), n= a.ncols(); for (int i=0;i<m;i++) for (int j=0;j<n;j++) s=s+pow(fabs(a[i][j]),p); return pow( s, 1.0/p) ; /* vnormp returns vector norm: (Sum_i a(i) ^p)^1/p */ DP vnormp(vec_dp &a, DP p) DP s=0.0; int m= a.size(); for (int i=0;i<m;i++) s=s+pow(fabs(a[i]),p); return pow( s, 1.0/p) ; /* ones returns matrix with all elements = 1, of given size */ void ones(mat_dp &a)

60 int m=a.nrows(), n=a.ncols(); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) a[i][j] = 1.0; /* unitmat returns a matrix with elements =1 on diagonal, 0 elsewhere, of given size */ void unitmat(mat_dp &a) int m=a.nrows(), n=a.ncols(); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) a[i][j] = 0.0; if (i==j) a[i][j] = 1.0; /* Transpose of a matrix */ void transp(mat_dp &a, Mat_DP &at) int m=a.nrows(), n=a.ncols(); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) at[j][i] = a[i][j]; /* Determinant of a matrix */ DP detmat(mat_dp &a) int m=a.nrows(), n=a.nrows(); if ((m!=n) (m<=1)) cout<<"matrix/vector dimension error in detmat. " <<endl; abort(); n=m;

61 Mat_DP aa=a; Vec_INT indx(n); DP t; NR::ludcmp(aa,indx, t); for (int j=0;j<n;j++) t = t*aa[j][j]; return t; DP residual(mat_dp &a, Vec_DP &x, Vec_DP &b) int ma=a.nrows(),na=a.ncols(); if ((na!=x.size()) (ma!=b.size())) cout<<"argument error in residual"<<endl; abort(); Vec_DP c(ma); matvecmul(a,x,c); for (int i=0;i<c.size();i++) c[i]=c[i]-b[i]; return vnormp(c,2.0); /* Overloading sum operator for matrices */ inline Mat_DP operator+(mat_dp &a, Mat_DP &b) Mat_DP c(a.nrows(),a.ncols()); matsum(a,b,c); return c; /* Overloading product operator for matrices */ inline Mat_DP operator*(mat_dp &a, Mat_DP &b) Mat_DP c(a.nrows(),b.ncols()); matmul(a,b,c); return c; /* Overloading product operator for matrix times scalar */ inline Mat_DP operator*(mat_dp &a,dp x) Mat_DP c(a.nrows(),a.ncols()); scalmatmul(a,x,c); return c; ¼

62 /* Overloading product operator for scalar times matrix */ inline Mat_DP operator*(dp x,mat_dp &a) Mat_DP c(a.nrows(),a.ncols()); scalmatmul(a,x,c); return c; /* Overloading minus operator for matrices */ inline Mat_DP operator-(mat_dp &a, Mat_DP &b) Mat_DP c(a.nrows(),a.ncols()); Mat_DP bb=(-1.0)*b; matsum(a,bb,c); return c; /* Overloading plus operator for matrix plus scalar */ inline Mat_DP operator+(mat_dp &a,dp x) Mat_DP c(a.nrows(),a.ncols()); scalmatsum(a,x,c); return c; /* Overloading minus operator for matrix minus scalar */ inline Mat_DP operator-(mat_dp &a,dp x) Mat_DP c(a.nrows(),a.ncols()); scalmatsum(a,-x,c); return c; /* Overloading plus operator for scalar plus matrix */ inline Mat_DP operator+(dp x,mat_dp &a) Mat_DP c(a.nrows(),a.ncols()); scalmatsum(a,x,c); return c; /* */ /* Overloading! operator to denote matrix transpose */ inline Mat_DP operator!(mat_dp &a) Mat_DP b(a.ncols(),a.nrows()); transp(a,b); return b; ½

63 /* Overloading ^ operator for matrix power */ inline Mat_DP operator^(mat_dp &a, unsigned int b) int m=a.nrows(), n=a.ncols(); if(m!=n) cerr<<"incompatible matrix dimensions.\n"; abort(); Mat_DP d(m,n); if(b>0) d=a; for(int i=2;(unsigned int)i<=b;i++) d=d*d; return d; /* Overloading << operator for matrix output */ ostream &operator<<(ostream &stream, const Mat_DP &a) int m=a.nrows(), n=a.ncols(); for (int j=0;j<m;j++) for (int k=0;k<n;k++) stream << fixed<<scientific<<setw(14); stream << setprecision(8)<<(a[j][k]) << " "; if (k==n-1) stream<<endl; return stream; /* Overloading << operator for vector output */ ostream &operator<<(ostream &stream, const Vec_DP &a) stream << fixed<<scientific<<setw(14); for (int j=0;j<a.size();j++) stream << setprecision(8)<<(a[j]) << " "; stream<<endl; return stream; /* cond gives the condition number of a square matrix */ ¾

64 DP cond(mat_dp &a) int ma=a.nrows(), na=a.ncols(); if ((ma!=na)) cout<<"matrix/vector dimension error in cond. " <<endl; abort(); Vec_DP w(na); Mat_DP u(ma,na),v(na,na); u=a; NR::svdcmp(u,w,v); // find maximum singular value DP wmax=w[0], wmin=w[0]; int n=ma; for (int k=0;k<n;k++) if (w[k] > wmax) wmax=w[k]; if (w[k] < wmin) wmin=w[k]; return wmax/(wmin+1e-100); /* invmat returns matrix inverse of a square matrix */ void invmat(mat_dp &a, Mat_DP &inva) int ma=a.nrows(), na=a.ncols(), mi=inva.nrows(), ni=inva.ncols() ; if ((ma!=na) (mi!=ni) (ma!=mi)) cout<<"matrix/vector dimension error in invmat. " <<endl; abort(); int n=ma; Mat_DP ai(n,n), sol(n,1); sol=1.0; ai=a; NR::gaussj(ai,sol); inva=ai; /* FILE matutl02.cpp begins */

65 /* FILE: myutl4.cpp begins */ /* USAGE:./a <myutl4.inp > a.jnk where myutl4.inp is */ /* The purpose of this program is to demonstrate the matrix and vector classes and their properties, as defined in the file matutl02.cpp. Some operations, such as matrix product can be computed in two ways, with matmul or with the overloaded * operator. */ #include <stdlib.h> #include <cstdlib> #include <cstdio> /*#include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> */ using namespace std; #include "nr.h" #include "matutl02.h" int main(void) int j,k,l,m,n; const char *fname="myutl1.dat"; init_srand(); // Initialize the random number generator. Mat_DP a(1,1); a=entermat2(2,4); // The size of a will change!! cout<<a; Mat_DP d(4,2),e(2,4),f(4,4); ranmat2(d, -10.0,10.0);

66 ranmat2(e, -10.0,10.0); cout<<"random matrix: "<<endl; showmat2(d," %8.4lf%"); showmat2(e," %8.4lf%"); f=d*e; showmat2(f," %10.6e"); fname="myutl1.dat"; fname=putmat2(f,fname); cout<<"matrix f saved in file "<< fname <<endl; Mat_DP g(1,1), h(1,1); g=getmat(fname); h=g; // Tehdaan h ja g samankokoisiksi cout<<endl<<"matrix g read from the file: "<<fname; showmat(g); h=f-g; cout<< "Difference h=f-g of original matrix \n"<< "and the one read from the file:" << " \n"<<endl; showmat2(h," %8.4e"); printf("norm_2(h)= %10.4e\n ", mnormp(h,2)); Vec_DP dd(4),vv(4) ; dd[0]=0.2313; dd[1]= ; dd[3]= ; matvecmul(f,dd,vv); showvec(vv); cout <<"\ntest of accuracy in 10x10 matrix inversion: \n"<<endl; Mat_DP a1(10,10), b(10,10), ai(10,10), u(10,10); unitmat(u); ranmat2(a1,-1,1); invmat(a1,ai); b=a1*ai; a1=b-u; printf("norm(a*inv(a)-id)= %10.4e\n ",mnormp(a1,2)); return 0; /* FILE: myutl4.cpp ends */ ÇÐÑÒ myutl4.cpp ĐĐÒØĐÑÒÒ ØÔØÙÙ ØÚÐÐ Ò Ø¹ ÔÒ ÓÑÑÒØ Ø ÐÑÒÚĐÐÐĐ ØÚÐк ÇÐÑ ÚÓÒ Ó¹ ÑÒÒÓÐÐ./a ÓÐÐÓÒ ÝĐÓØØØ ÒÒØÒ ÒĐÔÔĐÑ ØĐÓÐØĐ ØÙÐÓ ¹ ØÙ ØÔØÙÙ ÙÚÖÙÙÙÐк ÌÓÒÒ ÑÓÐÐ ÙÙ ÓÒ ÓØ ÝĐÓØ ØÙÐÓ ØÙ ØÓ ØÓÒ ÙØØ ØÔØÙÚ ÙÖÚ Ø./a <myutl4.inp >myutl4.dat

67 ÌÓ ØÓ myutl4.inp ÌÓ ØÓ myutl4.dat Enter matrix size (m,n):please enter integer in [2,6]: Please enter integer in [2,6]: Enter A[0,0]: The input you gave: 1.2 Enter A[0,1]: The input you gave: 3.4 Enter A[0,2]: The input you gave: -2.1 Enter A[1,0]: The input you gave: 6.4 Enter A[1,1]: The input you gave: 0.2 Enter A[1,2]: The input you gave: Random matrix: 4x2 matrix: x4 matrix: x4 matrix: e e e e e e e e e e e e e e e e+02 Matrix f saved in file myutl1.dat Matrix g read from the file: myutl1.dat 4x4 matrix: Difference f-g of original matrix and the one read from the file:

68 4x4 matrix: e e e e e e e e e e e e e e e e+00 norm_2(h)= e+00 A vector with 4 components: Test of accuracy in 10x10 matrix inversion: norm(a*inv(a)-id)= e Numeerisen lineaarialgebran perusoperaatiot. ÃÙØÒ ÝÓº Óй Ñ Ø myutl4.cpp Ò ØÙÐÓ Ø Ø ÐÑÒ ÑÓÒØ ÑØÖ Ð¹ ÖÒ ÓÔÖØÓØ ÚÓÒ ¹ÓÓ ØØĐĐ ÐĐ ÑÓÒ ÑÖ¹ ÒÒĐÓÒ ÙÒ ÑØÑØ º ÑÖĐ ÓÚØ ÑØÖ Ò ÙÑÑ ØÙÐÓ ÚÓÐÐ ÖØÓÑÒÒ ÑØÖ ÒÓÖÑ Đ ÒÐĐÓÑØÖ ÐÐ ĐĐÒØ ÑØÖ ØÖÑÒÒØغ ÆĐÒ ÓÐÐ ØÖÚØ ÑÑ Ø¹ Ó ÑѺ ÖÒ Ø ÖÚÒ ÚØÓ Đ ÑØÖ Ò ÑÙÙÒ¹ ØÑ Ø ÖØÝ Ò ÑÙÓØÓÒ ØÖÓØÙ Ò ÓÚÐÐÙ Ø ÐÒÖй ÖÒ ÓÒÐÑÒ ÖØÝ Ø ÐÒº ÝغÖÝÑĐÒ ÖØ ÙÙÒ ÓÑÒ¹ ÖÚÓØØĐÚÒº ÄÒÖ Ø ÝØĐÐĐÓÖÝÑĐØ Ó ÖÖÓÒÑØÖ ÐÐ ÓÒ ÖØÝÒÒ ÑÙÓØÓ ÚÓÒ Ù Ò ÖØ Ø ÐÔÓÑÑÒ Ø ØÓ¹ ÑÑÒ ÙÒ ÝÐ Ø ÐÒº ÝØĐÐĐÓÖÝÑĐغ ÇÒ ØÖÔÒ ØÖ ØÐÐ ÒØĐ ÚÐÑ ØÐÙÒ ÝÐ Ò ØÔÙ Òº Erityistyyppiset matriisit. ÌĐÖØĐ ÑØÖ ØÝÝÔÔĐ ÒÙÑÖ¹ Ð ÒÒ ÓÚØ ¹ ÝÐĐÓÐÑÓ¹ ÐÓÐÑÓ¹ ÐÓÓÑØÖ Øº ÐĐÓÐÑÓÑØÖ ¼ Ó ¹ ÒÙÑØÖ Ô¹ÓÒÐÑØÖ ¼ ÙÒ Ôµ ¹ ÝÑÑØÖÒÒ Ì µ ÓÖØÓÓÒÐÒÒ ÑØÖ Ì ½ µ

69 ¹ ÖÚØØĐÒ ÐĐÚ ØĐĐÚÓØØÓÒÒ Ð ÓÒÐÓÑÒÓÚµ Ø º È Ò½ ÐÐ ½ ¾ Ò µ ¹ÔÖÑÙØÓÒØÑØÖ Ò ÚØÑÐÐ ÒØØ Đ ÑØÖ ¹ ÖØ Ë ÓÒ ÓÖØÓÓÒÐÒÒº ¹ÒÐĐÓÑØÖ ÓÒ ÔÓ ØÚ Ø ÒØØ Ñ ÒØص Ó Ü Ì Ü ¼ Ú Øº Ü Ì Ü ¼µ ÐÐ Ü ¾ Ê Ò Ò ¼ Lause (Choleskyn hajoitelma) Ò Ò ÑØÖ ÓÒ ÔÓ ØÚ Ø ÒØØ Ó ÚÒ Ó ÓÒ ÓÐÑ ĐĐÒÒĐÓÐÐÒÒ Ò Ò ÐÓÐÑÓ¹ ÑØÖ Ä ÔÓ ØÚ Ò ÓÒÐÐÓÒ º ÄÄ Ì Kokeelliset virhearviot. à ÒÒ Ó ÓÐÑÓÒØØÝĐÓ Đ ÓÒ ÓÐÑÒ ØÓÑÒÒÒ ÓÐÐ ÙÙÒ ÚÖÑ ØÙ º ÅØÖ Ð ÒÒ Ø ØÙ Ò Ó Ò ÚÓÒ ØÙÓØØ ÚÖÖÚÓØ ÓÐÐ Ø ØÙÒ¹ Ò ÑØÖ Ò ÚÙÐк ÌÖ ØÑÑ Ø ÑÖĐº ÇÐÓÓÒ Ñ Ò ÑØÖ º ÇÐØÑÑ ØØĐ ÑÐÐĐ ÓÒ Ñ Ñ ÑØÖ É Ñ Ò ÑØÖ Ê ÓÐÐ ÔØĐ ÓÐÐ ÚÓÑ Øݹ Ò ÉÊ ÂÓÙÓÐÐ ØÙÒÒ ÑØÖ ÚÓÑÑ ØÙÓØØ Óº ØÝ Ò ÑÙÓÓ Ø ÖÓØÙ Ò ÉÊ ĐÝØØĐĐ ÙÙÖÒØ ÖÓØÙ Ò ÖÚÓ ÚÖÖÚÓÒº ÇÐØÑÑ ØØĐ ÑÐÐĐ ÓÒ ÓÐÑ LINsolve(a,b,x), ÓÒ ÔØĐ ÖØ Ø ÐÒº ÝØĐÐĐÓÖÝÑĐ Ü Ñ Đ ÓÒ Ò Ò Ñع Ö º ÅÙÓÓ ØÑÑ ØÙÒÒ ÑØÖ ÐÐ ÚØÓÖÒ Þ ÓÒ ÓÑÔÓÒÒØØ ÓÚØ ØÙÒÒØØ٠Ѻ ½µ Þ ÇÐÓÓÒ x LINsolveÒ ØÙÓØØÑ ÒÙÑÖÒÒ ÖØ Ùº ÅÖØĐĐÒ Ö ½ Þ Ü Ö ¾ Ü º ËÐÐÓÒ Ö ½ ÓÒ ÒÙÑÖ Ò ÖØ ÙÒ ÚÖ Ö ¾ Ò º Ö Ùк ÅÓÐÑÔ ÚÓÒ ĐÝØØĐĐ ÚÖÒ ÖÚÓÒ¹ ØÒ Ó Ò ØÙÒÒØÒº ÀÙÓÑ ØØĐ Ö ¾ ÚÓÒ Ð Ò ÙÒ Ø Ö ½ ÔÐĐ ØĐĐÒ ÒĐ ØÔÙ ØØĐ ØÖ ÖØ Ù ØØĐĐÒ ØÙĐØÒº ÅÓÐÑÔÒ ÑÖÒ ØÔÙ ÚÖ ÓÒ ÔÒº ÃÙØÒ ÐÙ¹ ÚÙ ¾ ØÙÐÐÒ ÒĐÑĐĐÒ ÐÒº ÝØĐÐĐÓÒ ÖØ Ù ÚÖÒ ÙÙ¹ ÖÙÙ ÐÙÓ ÓÒ Ù Ø ½¼ ½ Ø ÔÖÑÔº Matriisin kuntoisuusluku. ÆÙÑÖ Ò ÑØÖ ÐÖÒ ØĐÖ¹ ÑÔĐ Đ ØØØĐ ÓÒ Ò Ò ÑØÖ Ò Ò º ÙÒØÓ ÙÙ ÐÙÙ Òк ÓÒ¹

70 ØÓÒ ÒÙÑÖµ Ó ÙÚ Ø ÑØÖ Ò ÒÙÑÖ ÓÑÒ ÙÙ º ÂÓ ÓÒ ÒÐĐÓÑØÖ ÒÒ ÓÒ µ ½ ÒÙÑÖ Ø ÓÑÒ¹ ÙÙØ ÙÓÒÓÒÚØ ÓÒ µò Ú º ÃÙÒØÓ ÙÙ ÐÙÙ ÚÓع Ò ÙØ Ù ÑÝĐÓ ÖÝÝ ÔÖÑØÖ Ø ĐÖĐÓÐØØÙ ÐÐĐ ÙØÒ ØÙÐÑÑ ÒĐÑĐĐÒ ØÓ ÙÚ Ø ÚÖÒ ÚÓÑ ØÙ¹ Ñ Ø ÐÒÖÙÚÙ º ÂØÓ ØÙÐÑÑ ØØÐÑĐĐÒ ÐÝÝ Ø ÓÒ µò ĐÝØØĐÓĐº ÀÙÓÑ ØØĐ ÓÒ µ ÓÐ Ó Ó matutl02.cpp ÔØغ /* FILE: mycond.cpp begins. */ #include <stdlib.h> #include <cstdlib> #include <cstdio> using namespace std; #include "nr.h" #include "matutl02.h" void ShowUWV(Mat_DP &a) int ma=a.nrows(),na=a.ncols(); Mat_DP u(ma,na), v(na,na),w1(na,na); Vec_DP w(na); u=a; w1=0.0; cout<<"a= "<<endl; showmat2(a,"% 10.5f "); NR::svdcmp(u,w,v); for (int i=0;i<na;i++) w1[i][i]=w[i]; cout<<"u= "<<endl; showmat2(u, "%10.5lf "); cout<<"w^t= "<<w <<endl; cout<<"v= "<<endl; showmat2(v, "%10.5lf "); /* Estimate SVD decomposition error: */ Mat_DP tmp1(ma,na), tmp2(na,na), tmp3(ma,na); matmul(u,w1,tmp1); transp(v,tmp2); matmul(tmp1,tmp2,tmp3 ); tmp1=a-tmp3; printf("norm(a- u *w * v^t) = %10.4e\n",mnormp(tmp1,2.0)); int main() int ma=3,na=3,mb=5,nb=5; Mat_DP a(ma,na), b(mb,nb); double con1, con2;

71 ranmat2(a,0.1, 1.5); ShowUWV(a); con1=cond(a); printf("cond(a) = %16.4e \n",con1); unitmat(b); b[0][0]=17.0; cout <<"B= "<<endl; showmat2(b,"% 8.5g "); con2=cond(b); printf("cond(b) = %16.4e \n",con2); return 0; /* FILE: mycond.cpp ends. */ A= Ì ØÓÒ ØÙÓØØÑ ØÙÐÓ ØÙ 3x3 matrix: u= 3x3 matrix: w^t= v= 3x3 matrix: norm(a- u *w * v^t) = e-16 cond(a) = e+00 B= 5x5 matrix: cond(b) = e+01 ¼

72 1.31. Kolmiomatriisit. ÄÒº Ò Ò ÝØĐÐĐÓÖÝÑĐÒ Ü ÖØ Ù ÐÔÓØØÙÙ ÓÐÐÐ Ø Ó ÓÒ ÓÓ ÝÐĐÓÐÑÓÑØÖ Í Ø Ð¹ ÓÐÑÓÑØÖ Ä Ò ÑÑĐ Đ ØÔÙ ÚÓÑÑ ÚÑ ØĐ ÝØĐÐĐÓ ØĐ ÖØ Ø Ü Ò Ò ÓØØ Ò ØÓ ÚÑ Ò ÖØ Ø Ü Ò ½ Ò ÔÖÙÙØØÒ ÙÒÒ ÓÑÔÓÒÒØØ ÓÒ ÖØ ØÙº ÌÓ¹ ØÔÙ ÚÓÑÑ Ø ØĐ ÔĐÒÚ Ø ĐÖ ØÝ Đº ÂÓ Ò Ò ÑØÖ ÐÐ ÓÒ ÓØÐÑ ÄÍ Ñ Đ Ä Í Ú ¹ ØÚ Ø ÓÚØ ĐĐÒÒĐÓÐÐ Đ Ð¹ ÝÐĐÓÐÑÓÑØÖ ÒÒ ÝØĐÐĐÓÖÝÑĐÒ Ü Ý ÖØ ÑÒÒ ÔÐÙØÙÙ ÙÖÚ ÝØĐÐĐÓÖÝÑĐ ÄÞ Ý ÍÜ Þ ÅÓÐÑÑØ ÚÓÒ ÖØ Ø ÐÐĐÙÚØÙÐÐ ÑÒØØÐÝÐÐĐº Choleskyn hajoitelma. ÐÐĐ ÙÚØØÙ ÓØÐÑ Ò Ò Ñع Ö ÐÐ Ò ÓÐ ÓÐÑ º ÖĐ Đ ÖÓ ØÔÙ ÓØÐÑ ÚÓÒ ÑÙÓÓ Ø ÐÔÓ Øº ÓÐ ÝÒ ÐÙ Ò ÒÓÐÐ ÒĐÒ ÓÒ Ö¹ ØÝ Ø ÐÐÓÒ ÙÒ ÓÒ ÔÓ ØÚ Ø ÒØØ ÝÑÑØÖÒÒº ÐÐÓÐÚ ÐÓÖØÑ ÖÓØØ Ò ÔĐĐÐÐ ÑØÖ Ò Ä Algorithm (Cholesky factorization) for ½ to Ò Ô for ½ to Ò end for ½ to Ò for ½ to Ò end end end ÐÓÓÔ ÓÚÖ ÓÐÙÑÒ Ð ÙÖÖÒØ ÓÐÙÑÒ ÖÓÑ ÖÑÒÒ ÓÐÙÑÒ ÙØÖØ ÑÙÐØÔÐ Ó ÙÖÖÒØ ÓÐÙÑÒ ÃÓÒ ½º ½ ÑÙÒ ÓÐ ÝÒ ÓØÐÑÒ ÚÙÐÐ ÚÓÑÑ Öع Ø ÝØĐÐĐÓÖÝÑĐÒ Ü Ý ÔÓ ØÚ Ø ÒØÐÐ ÑØÖ ÐÐ Óº ÑÙÓÓ ÐÓÖØÑ ÓÒ ÑÔÐÑÒØÓØÙ ÓÐÑÒ mychol3.cpp Ó ÐĐÓÝØÝÝ ÙÖ Ò ÛÛÛ¹ ÚÙÐغ à º ÑÝĐÓ NR::cholsl, NR::choldcº ½

73 1.33. Householderin QR hajoitelma. ÆÙÑÖ Ò ÐÒÖÐÖÒ ØĐÖÑÔĐ ÐÓÖØÑ ÓÒ Ñ Ò Ñ Ò ÑØÖ Ò Ò º ÉÊ ¹ ÓØÐÑ Ó ÒØ ØÝ Ò ÉÊ Ñ Đ É ÓÒ Ñ Ñ ÓÖØÓÓ¹ ÒÐÒÒ ÑØÖ Ê Ñ Ò ÑØÖ ÓÐÐ ÓÒÐÒ ÐÔÙÓÐ Ø ÐÓØ ÓÚØ ÒÓÐк ÀÓØÐÑÒ ÔĐĐ ØĐĐÒ ØÑĐÐÐĐ ÔÖĐĐ Đ ÓÖØÓÓÒÐÑÙÙÒ¹ ÒÓ Ò ÔÔÐØغ ÅÙÙÒÒÓ À ½ Ò ÒÓÐÐ Ò ÓÒ¹ ÐÒ ÐÔÙÓÐ Ø ÓÑÔÓÒÒØØ Ö ÙØÒÒ ØÒ ØØĐ Óº ÖÚØÓÖÒ ÔØÙÙ ĐÐÝÝ ÑÙÙÒÒÓ º ÃÙÒ ØĐÐÐÒÒ ÓÖØÓ¹ ÓÒÐÑÙÙÒÒÓ ÚÓÒ ØÙÐØ ÔÐÙ ÙØÒ ÐÐ ØØĐĐÒº ÀÓÙ ÓÐÖÒ ÑÙÙÒÒÓ ÓÒ Ñ Ñ ÑØÖ ÓÐÐ ÓÒ ÑÙÓØÓ À Á ¾ ÚÚÌ Ú Ì Ú Ñ Đ Ú ¼ ËÐÐÓÒ À À Ì À ½ ÓØÒ À ÓÒ ÝÑÑØÖÒÒ ÓÖØÓÓÒÐÒÒº ÀÐÙÑÑ ÚÐØ ÒÒØÙÐÐ ÚØÓÖÐÐ ÚØÓÖÒ Ú ÓÐÐ ÑÙÙØ ÔØ Ò ÑÑĐÒÒ ÓÑÔÓÒÒØØ À Ø ÓÒ ÒÓÐÐ À «½ ÓÐÐÒ «ËÐÐÓÒ «½ À Á ¾ ÚÚÌ Ú Ì Ú µ ¾Ú ÚÌ Ú Ì Ú µ Ú «½ µ ÚÌ Ú ¾Ú Ì ËÐÖØĐ ÚÐØÒ ½ ÓÐÐÓÒ Ú «½ ÃÓ À ĐÐÝØØĐĐ ÒÓÖÑÒ ÔØĐĐ ÚÐØ «ÅÖØ ÚÒ ÒÙÑÖÓÒ ÙÑÓÙØÙ¹ Ñ Ò Đ Ñ ÚÐØÒ «Ò ½ µ ÌÚÐÐÒÒ ÓÚÐÐÙ ØÐÒÒ ÓÒ ÔÒ ¹ÝØĐÐĐÓÒ ÖØ ÑÒÒ Ó¹ ÓØ ÝØĐÐĐÓÖÝÑĐĐÒ Ü Ñ Đ ÓÒ Ñ Ò Ñ Ò ØĐÐĐÓÖÝÑĐ ĐÐÝÝ ÑÒ ÙÒ ÖÖÓØÒ À ½ ÐÐ À ½ Ü À ½ ÂØÒ ÒĐÒ Ò ÐÓÔÙÐØ ÑÙÓØÓÓÒ À Ò À ½ Ü É Ì É Ì À Ò À ½ Ó Ø Ü ÚÓÒ ÐÔÓ Ø ÖØ Ø Ó É Ì Ò ÓÒÐÒ ÐÔÙÓ¹ Ð Ø ÐÓØ ÓÚØ ÒÓÐк ÊØ ÙÙÒ ØÖÚØ Éغ ¾

74 ÐÐÓÐÚ ÐÓÖØÑ ØÙÓØØ ÑØÖ Ø Ñ Ò Ñ Ò ÔÖĐĐ ÐÐĐ ÓÖØÓÓÒÐÑÙÙÒÒÓ ÐÐ ÑØÖ Ò Ê ÅØÖ É ÓÒ ØÖÙÓºµ ÐÓÖØÑ ÓÒ ÑÔÐÑÒØÓØÙ ÓÐÑÒ myhouse2.cpp Ò ÔÐØÒ ÑÝĐÓÑÑÒº Algorithm (QR Factorization) for ½ to Ò ÐÓÓÔ ÓÚÖ ÓÐÙÑÒ «Ò µ Õ ¾ ¾ Ñ ÓÑÔÙØ ÀÓÙ ÓÐÖ v ¼ ¼ Ñ Ì «e ÚØÓÖ ÓÖ ÙÖÖÒØ ÓÐ vv Ì if ¼ then Ô ÙÖÖÒØ ÓÐÙÑÒ ÓÒØÒÙ ÛØ ÒÜØ Ø³ ÐÖÝ ÞÖÓ for to Ò ÔÔÐÝ ØÖÒ ÓÖÑØÓÒ v Ìa ØÓ ÖÑÒÒ a a ¾ µv ÙÑØÖÜ end end 5 4 λ=(v T a)/(v T v) 3 a a 2λ v a 2 e 1 a λ v λ v

75 a a λ v λ v a 2λ v a 2 e λ=(v T a)/(v T v) Iteratiiviset algoritmit. ÌÚÒÓÑ ÐÐ ÐÒÖ Ò ÝØĐÐĐÓÖݹ ÑĐÒ ÖØ ÙÑÒØÐÑÐÐĐ ÓÒ ÝØÒÒ ÔÖÖ Ò ÔÖÙ ØÙÚØ ÐÒ¹ ÖÐÖÒ ØÙÐÓ Ò ØÖÚØØÚÒ Ð ÙØÓÑØÙ ØÒ ÑĐĐÖĐ Ð Ð ÒÒÒ ÚØÚÙÙ ÓÒ ÐÙÓ Ò Ó ÝغÖÝÑĐÒ ÓÓ ÓÒ Ò Ò ÄÓÒ ÝØĐÐĐÓÖÝÑÒ ØÔÙ ÚÓ ÙØÒÒ ÓÐÐ ÔÖÑÔ ĐÝØØĐĐ Ò º ØÖØÚ ÑÒØÐÑĐº ÈÖÙ ØÙ Ò ÓÒ ÖÓع Ø Ò Ò ÝØĐÐĐÓÖÝÑĐ ØÓ Ò Ü Ü Ì Ü ÓÚÐØ ØÖØÓØ Ü ½µ Ì Ü µ Ó ÝÐ ØĐĐ ÝÒ ÑÙÙع ØÙÒ ÙÒØÓÒ ØÔÙ ØÐØÝĐ ÒØÓÔ ØØÖØÓغ ÀÓØй Ñ ÐĐÓÝØÝÝ ÙÖÚ Øº ÃÖÓØØÒ Ä Í ÐÓÛÖ ÓÒÐ ÙÔÔÖ ØĐ Đ ÓÒÐÐÓØ ÑÙÒ ÔÐĐ ØĐĐÒ Đµ ÓÐÐÓÒ Ü Ü Ä ÍµÜ Ë Ì ½ Ä Íµµ ½ ÃÓÑÔÓÒÒØØÑÙÓÓ ¹ Ò ØÝ Ü ½µ Ä ÍµÜ µ µ ½ ¾ Ò

76 Ø ÝØĐÔØĐÚĐ Ø Âµ Ü ½µ Ò ½ Ü µ µ Ñ Đ ÝÐĐÒ Ú Ø ØÖØÓÒ ÒÙÑÖÓº ÁØÖØÓ ÓÒ ÒÑÐØĐĐÒ ÂÓÒ ØÖØÓº ÌĐÑĐ ØÖØÓ ÙÔÔÒ ÐÐ ÐÙÖÚÓÐÐ ÚÒ ØØÝÒ ÑØÖ Ó ÚÒ ÓÐØÙ Ò ÚÖغ ÙÖº ÐÙ µº Ä ¹ ÒÒÒ ÚØÚÙÙ ÖÔÔÙÙ ÒÝØ ÐÙØÙ Ø ØÖÙÙ Ø ÚÒ Âµ ÚØÚÙ٠غ ÀÙÓÑ Ó ÑØÖ ÓÒ ÖÚ ÒÓÐÐ Ø ÖÓÚÒ ØÖÑÒ ÑĐĐÖĐ Ç Òµµ ÚÓÒ ÚÒ Âµ ÙÑÑ ØÓ Ø ÖÓع ØÙÑÐÐ ÒÓÐÐ Ø ÖÓÚÒ ØÖÑÒº ÂÓÒ ÑÒØÐÑĐ ÓÒ ÐĐØĐÓÓØÒ ÖĐÐÐ ÑÙÐÐ ØÖØÚ Ð¹ Ð ÑÒØÐÑÐк Æ º Ù Ò¹ËÐÒ ØÖØÓ ÔÖÙ ØÙÙ ÙÖ¹ ÚÒ ÙÓÑÓÓÒº ÂÓ Ú Âµ Ð ÒØ ØÔØÙÙ Ò Ò ÑÙ¹ Ò ÚÚ ĐÖ ØÝ Đ ÓÒ Ó Ð ØØÙ ÖÚÓÐÐ ½ ¼ ÒÒ Ú ¼ ½ ÚÓØ Ò ØÖÑÒ Ü µ ĐÝØØĐĐ ØÖÑĐ Ü ½µ ÑÒØÐÑĐ Đ ĐÝØØĐĐÒ Ú Ëµ Ü ½µ ½ ¼ Ñ Ø ½ ¼ ÌÓ Ò ÒÓÒ Ù Ò¹ËÐÒ Ò ½ Ü ½µ Ò ½ Ü µ µ ÅÒØ ÑÑ ÚÐĐ ÓÐÑÒÒÒÒ ØÖØÚ Ò ÑÒØÐÑĐÒ Ò º ËÇʹØÖØÓÒ Ù Ú ÓÚÖÖÐÜØÓÒµº ËÒĐ Ú Ëµ ÓÖ¹ ÚØÒ ÙÖÚÐÐ ËÇʵ Ü ½µ ½ µü µ Ò ½ Ü ½µ Ò ½ Ü µ µ ËÇʹÑÒØÐÑĐ ÙÔÔÒ ÓÔÚÐÐ ÔÖÑØÖÒ ¾ ¼ ¾µ ÖÚÓÐÐ ÒÓÔÑÑÒ ÙÒ Ù Ò¹ËÐÒ ÑÒØÐÑĐº ÊØØĐÚĐ ØÓ ØÖØÓÒ Âµ ˵ ÙÔÔÒÑ ÐÐ ÓÒ ¹ ØØØÝ ÑѺ ÓÒÐÔÒÓØØ ÐÐ ÑØÖ Ðк ÆĐÐÐ ÑØÖ ÐÐ ÓÒ Ò ÓÐÑ ÑÝĐÓ ĐĐÒØ ÑØÖ º Lause. ËØÓÖ¹ÙÐÖ ÌÑ º¾º º¾º½¾ ÂÓÒ Ù Ò¹ ËÐÒ ØÖÓÒÒØ ÙÔÔÒÚØ ÐÐ ÑØÖ ÐÐ ÓÐÐ ÔĐØ Ö¹

77 ÚØØĐÒÒ ÓÒÐÒÒ ÓÑÒÓÒØØÓ Ò ½ ½ ¾ Ò ËÙÖÚ ÓÐÑ ÑÔÐÑÒØÓ Đ ÂÓÒ ØØĐ Ù Ò¹ËÐÒ ØÖØÓØ ÐÒÖ Ò Ò Ò ÝØĐÐĐÓÖÝÑĐÒ ÖØ Ñ º Ò¹ ÖÓÑÑ Ò Ò ÓÒÒ ØÙÒÒ ÑØÖ Ò ÚØÑÑ Ò ¹ ÓÒÐÐÓØ ÒÒ ØØĐ ÝÓº ÙÔÔÒÑ ÐÙ Ò ØÓ ØÙÐ ÚÓÑÒº ÁØÖÓÒÒÒ ÐÙÖÚÓÒ ÓÒ ÓÖÓº ÄÓÔÙ ÚÖØÑÑ ÐĐÓÝØØÝĐ Öع Ù ÐÙÒÔÖÒ Ó ØÓ ÑÑ ÓÐÚÒ ÙÙÖÒ ÑÑ Ö¹ ÚÓÒ ÚÖ ØĐº ÐÐĐÓÐÚ ØÔÙ ÑÓÐÑÑØ ØÖØÓØ Ó¹ ØÚØ ÑÒ ÙÙÖÒ ÙÓÑÑÑ ØØĐ Ù Ò¹ËÐÒ ØÖ¹ ØÓ ÙÔÔÒÑÒÒ ÓÒ ÑÒ ÒÓÔÑÔº /* FILE: myjgsit.cpp begins. */ /* Jacobi/Gauss-Seidel iterations to solve a linear system */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include "nr.h" #include "matutl02.h" void Jacobi_iter(Mat_DP &a, Vec_DP &b, Vec_DP &x, Vec_DP &xold) DP s; int i,j,ma=a.nrows(); if ((ma!=a.ncols()) (ma!=b.size()) (ma!=x.size()) (ma!=xold.size())) cout<<"argument error in Jacobi_iter\n"<<endl; abort(); for (i=0;i<ma;i++) /* This is Jacobi iteration */

78 s=0.0; for (j=0;j<ma;j++) if (i!= j) s+=a[i][j]*xold[j]; xold[i]=x[i]; x[i]=(b[i]-s)/a[i][i]; void GaussSeidel_iter(Mat_DP &a, Vec_DP &b, Vec_DP &x, Vec_DP &xold) DP s; int i,j,ma=a.nrows(); if ((ma!=a.ncols()) (ma!=b.size()) (ma!=x.size()) (ma!=xold.size())) cout<<"argument error in GaussSeidel_iter\n"<<endl; abort(); for (i=0;i<ma;i++) /* This is Gauss-Seidel iteration */ s=0.0; for (j=0;j<ma;j++) if (j <=i-1) s+=a[i][j]*x[j]; if (j >=i+1) s+=a[i][j]*xold[j]; xold[i]=x[i]; x[i]=(b[i]-s)/a[i][i]; int main() int ma; int i,j,k,ikind,ikindold,new1 ; ma=6; Mat_DP a(ma,ma); Vec_DP b(ma),x(ma),xold(ma),sol(ma); DP er,s; init_srand(); /* Give some values for a and b */ ranmat2(a,-0.99, 0.99); for (i=0;i<ma;i++) for (j=0;j<ma;j++) a[i][j]=ceil(10*a[i][j]); /* We give integer values for the entries of a */ for (i=0;i<ma;i++) s=0.0;

79 for (j=0;j<ma;j++) if (j!=i) s= s+fabs(a[i][j]); if (fabs(a[i][i]) < s ) a[i][i]=s+ma/2; /* Diag. entries are increased a bit, to ensure convergence of the iteration */ cout<<"matrix a ="<<endl; showmat2(a,"% 10.5f "); /* We make a solution in integer components */ for (i=0;i<ma;i++) sol[i]=(int)(ma/2)-i; /* and, the corresponding RHS: */ matvecmul(a,sol,b); for (i=0;i<ma;i++) x[i] =0.0; xold[i]=0.0; new1=0; ikind=0; do ikindold=ikind; printf("enter iteration: (1) Jacobi, (2) Gauss-Seidel \n"); scanf("%ld",&ikind); printf("\n ***\n ikind = %ld \n",ikind); for (i=0;i<ma;i++) printf(" x[%ld]",i); printf("\n"); /* Restart with x=0 if ikind!=ikindold */ if (ikind!= ikindold) for (i=0;i<ma;i++) x[i] =0.0; xold[i]=0.0; printf("\n 1 :"); for (i=0;i<ma;i++) printf(" %9.6f",x[i]); printf("\n"); for (k=1;k<=40;k++) if (ikind ==1) Jacobi_iter(a,b,x,xold); if (ikind ==2) GaussSeidel_iter(a,b,x,xold); if (k==5*((int)(k/5)) ) printf("%2d :",k); for (i=0;i<ma;i++) printf(" %9.6f",x[i]); for (i=0;i<ma;i++) printf(" %12.9f",x[i]); s=residual(a,x,b); printf("\nresidual = %12.4e \n",s); printf("enter 0 if iterate again: \n"); scanf("%ld",&new1); while (new1==0) ; return 0; /* FILE: myjgsit.cpp */ Ohjelman tulostusta:

80 Matrix a = 6x6 matrix: Enter iteration: (1) Jacobi, (2) Gauss-Seidel *** ikind = 1 x[0] x[1] x[2] x[3] x[4] x[5] 1 : : e : e : e : e : e : e : e : e Residual = e-06 Enter 0 if iterate again: Enter iteration: (1) Jacobi, (2) Gauss-Seidel *** ikind = 1 x[0] x[1] x[2] x[3] x[4] x[5] 1 : : e : e : e : e : e : e : e : e Residual = e-13

81 Enter 0 if iterate again: Enter iteration: (1) Jacobi, (2) Gauss-Seidel *** ikind = 2 x[0] x[1] x[2] x[3] x[4] x[5] 1 : : e : e : e : e : e : e : e : e Residual = e-09 Enter 0 if iterate again: Enter iteration: (1) Jacobi, (2) Gauss-Seidel *** ikind = 2 x[0] x[1] x[2] x[3] x[4] x[5] 1 : : e : e : e : e-14 (...) 40 : e Residual = e+00 Enter 0 if iterate again: Permutaatiomatriisit. ÃÖØÓÑÐÐ Ò Ò ÑØÖ Ú ÑÑй Ø ÚÓÒ ÚØ ÑØÖ Ò ÖÚØ ÖØÓÑÐÐ ÓÐØ Öغ ÛÛÛ¹ ÚÙÐÐ ÓÒ ØĐĐÒ ÐØØÝÚĐ ÑÖÓÐÑ mymatope.cppº Kurssilla käytettävä hakemistorakenne. ¼

82 nrc02 - answers - data (dates1.dat) - drivers (xairy.cpp) - lib (libnr.a) - responses (sfroid.resp,...) - sources (addint.cpp,.. NR ohjelmat) - utils (mybugs.h, nr.h, nrutil.h,...) - gnuplot02 (gnuplot-ohjelmia) - democpp02 (luentojen demo-ohjelmia, esim. myutl4.cpp ) - wrk (tyohakemisto) - harj - h00 - h h Aputiedosto beg.cpp. ÃÓ ½º½ ÑÒØØÙ ÔÙØÓ ØÓ beg.cpp ÚÓÑÑ ÑÙÙØØ ÓÙ ØÚÒ ĐÝØØĐÓĐÓÒ ÙÖ ÐÐÑÑ Ø¹ ÑĐÐÐĐ Ò ÖÐ ØĐÝÒÒÝ Đ º Ðк /* FILE: beg.cpp begins. */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include "nr.h" #include "matutl02.h" int main() Mat_DP a(4,4),ai(4,4),b(4,4),u(4,4); ranmat2(a,-1,1); invmat(a,ai); unitmat(u); matmul(a,ai,b); /* Also b=a*ai; */ a=b-u; // a= a*inv(a)-id cout <<"a*inv(a)-id = \n"<<a<<endl; ½

83 cout<<"norm2(a*inv(a)-id) = "<<mnormp(a,2)<<endl; /* FILE: beg.cpp ends. */ NR:n esimerkkiohjelmat. ËÙÖÚ Ø ØÙÒØÓÐÓ Ø ÐÑÒ ØÓ ÐØ ÑØĐ ÚÙ ÚÓ ØÙÐÐ Ú ØÒ ÙÒ ÓÐ ÓÐÑÒ ØÓÑÒØ ØÓ ÐØ ÑØÒ ÚÙØ ÚÓØØÒº ÌĐ Đ ÓÒ Ø ÓØØÙ ÔÐĐ ØĐĐÒ ÓÐÑ ludcmp ÑÙØØ ÑÙÒ ÓÐÑÒ ĐÝØØĐÓ ÓÒ ØĐÝ Ò ÒÐÓ Øº pwd /home/vuorinen/nrcpp02/wrk find../. -name *.cpp xargs grep ludcmp.././drivers/xcyclic.cpp: NR::ludcmp(aa,indx,d);.././drivers/xlubksb.cpp: NR::ludcmp(c,indx,p);.././drivers/xludcmp.cpp:// Driver for routine ludcmp.././drivers/xludcmp.cpp: NR::ludcmp(a,indx,d);.././drivers/xmprove.cpp: NR::ludcmp(aa,indx,d);.././sources/fred2.cpp: ludcmp(omk,indx,d);.././sources/fredex.cpp: NR::ludcmp(a,indx,d);.././sources/ludcmp.cpp:void NR::ludcmp(Mat_IO_DP &a, Vec_O_INT &indx, DP &d).././sources/ludcmp.cpp: if (big == 0.0) nrerror("singular matrix in routine ludcmp"); cp../drivers/xludcmp*.../drivers/xludcmp.cpp ->./xludcmp.cpp g++ xludcmp.cpp -o a -lm xludcmp.cpp:5: nr.h: No such file or directory g++ xludcmp.cpp -o a -lm -lnr xludcmp.cpp:5: nr.h: No such file or directory g++ xludcmp.cpp -I../util -o a -lm -lnr xludcmp.cpp:5: nr.h: No such file or directory g++ xludcmp.cpp -I../utils -o a -lm -lnr /usr/bin/ld: cannot find -lnr collect2: ld returned 1 exit status g++ xludcmp.cpp -I../utils -I../lib -o a -lm -lnr ¾

84 /usr/bin/ld: cannot find -lnr collect2: ld returned 1 exit status ls../lib libnr.a g++ xludcmp.cpp -I../utils -L../lib -o a -lm -lnr a bash: a: command not found Numerical Recipes run-time error... Data file matrx1.dat not found...now exiting to system... find../. -name matrx1.dat.././drivers/matrx1.dat.././data/matrx1.dat cp../data/mat*.../data/matrx1.dat ->./matrx1.dat../data/matrx2.dat ->./matrx2.dat../data/matrx3.dat ->./matrx3.dat ls #a.jnk# a.jnk badmtx.cpp~ matrx1.dat matrx3.dat a badmtx.cpp beg.cpp matrx2.dat xludcmp.cpp original matrix: product of lower and upper matrices (rows unscrambled): (...)

85

86 2 LINEAARISET YHTÄLÖRYHMÄT 2.1. Lineaariset yhtälöryhmät ja laskennallinen tiede. ÄÒÖ ÝØĐÐĐÓ¹ ÖÝÑĐ ÒØÝÝ Ù ØÒÒ ÐÙÓÒÒÓÒØØÒ ÓÚÐÐÙ ¹ Đ ÑÓÒÒÐ ØÐ ØÓÐÐ ØÖ ØÐÙ ÝØ ÙÒØع ØÒ ÙÔÐÐ ØÒ ØØÒ ÐÙÐк Ä ÒÒÐÐ Ò ØØÒ Ô¹ Ö Đ ÒÙÑÖ Ø ØØĐÚĐØ ĐÐØĐÚĐØ ØÚÐÐ Ø Ó ÒÒ ÐÒÖ Ò ÝØĐÐĐÓÖÝÑĐÒ ÖØ ÙÒº ØĐÐĐÓÖÝÑÒ ÓÙØÒ ÑØÑØØ Ò ÑÐÐÒØÑ Ò ÙØغ ÅÐÐ ÓÔÚ Ø Ý ÒÖØ ØÑÐÐ ÔÝÖØĐĐÒ ØÚÐÐ Ø Ò ØØĐ ÐÙÔÖĐÒÒ ÑÓÐÐ Ø ÔĐÐÒÖÒÒ ØØĐÚĐ ÚÓØ Ò ÔÐÙØØ ÐÒÖ Ð ÐÒÖ Óº ÑÖ¹ Ó ØØ «ÖÒØÐÝØĐÐĐÓÒ ÒÙÑÖ Ò ÖØ ÙÒ ¹ ÒĐ Ó Ò ÓÒ ÐÓÒ ÐÒÖ ØÒ ÝØĐÐĐÓÖÝÑÒ ÖØ Ùº ÅĐÐ ÝØĐÐĐÓÖÝÑĐ ÓÒ ÒÒ ÙÙÖ ØØĐ ÖÖÓÒÑØÖ Ò ÑÙ ØØÐÒ ØÖ¹ Ú Ø Ð ÒÒÒ ÚØÑ ÑÙÓÓ ØÙÚØ ÓÒÐÑ ÔÝÖØĐĐÒ ÝĐÓÝÒØĐÑĐĐÒ ÖÖÓÒÑØÖ Ò ÖÒÒØØ ØÐÐØØÑÐÐ ÚÒ ÒÓй Ð Ø ÖÓÚØ ÐÓغ ÅØÖ Ò ÑÓÐÐ Ø ÝÑÑØÖ ÚÓÒ ÑÝĐÓ ĐÝØØĐĐ ÑÒ ØÔÒ ÑÙ ØÖ ÙÖ Ò ĐĐ ØĐÑ º ÄÒÖ Ò ÝØĐÐĐÓÖÝÑĐÒ ÝÐÒÒ ÑÙÓØÓ ÓÒ ½µ ½½ Ü ½ ½¾ Ü ¾ ½Ò Ü Ò ½ ¾½ Ü ½ ¾¾ Ü ¾ ¾Ò Ü Ò ¾ º º ѽ Ü ½ Ѿ Ü ¾ ÑÒ Ü Ò Ñ Ø ÑØÖ Ò ÚÙÐÐ ÐÙ ÙØØÙÒ ¾ ½½ ½Ò ¾µ ¾½ ¾Ò º º ѽ ÑÒ ¾ Ü ½ Ü ¾ º Ü Ò ¾ ÄÒÖÐÖ ÒØ ØĐÝÐÐ Ò Ú ØÙ Ò Ý ÝÑÝ Ò Ñع Ö ÝØĐÐĐÓÒ ¾µ ÖØ ÙÒ ÓÐÑ ÓÐÓ Ø Ý Đ ØØ ÝÝ ØĐº ÂÓ Å Æ ÖØ Ù ÝÐÒ Đ ÓÐ Ý Đ ØØÒÒº ÂÓ Å Æ ½ ¾ º Ñ

87 ÖØ Ù ÝÐÒ Đ ÓÐ ÓÐÑ ÐÒÖÐÖÒ ÑÐ Đ ÑÙع Ø ÚÓÒ Ø Đ ÖØ Ù ÔÒÑÑĐÒ ÒÐĐÓ ÙÑÑÒ ÔÒ µ ÑÐ Đº ÌÔÙ Å Æ ÝØĐÐĐÓÖÝÑĐÐÐĐ ¾µ ÓÒ Ý Đ ØØÒÒ ÖØ Ù Ó ÚÒ Ó ÓÒ ÓÐÑ ĐĐÒØ ÑØÖ ½ ÅØÖ Ò ØÝ ØĐ ØØÓÓÒ ØÖ ØÐØÒ Ó ÐÐ Ò ÐÙÚÙÒ ÐÓÔÙ º ÄĐØĐÓÓØÒ ÓÒ ÐÓÓÒÒ ÓÓŠƺ ÌÖÚØÒ Ýݹ ÒÒ ÚÓ Ó ØØÓÓÒÒ Ñ٠ص ÓÒ ÓÓ ÓÒ ÅÈ ÆÈ ÑÙ ØÝ ĐÓĐ Ý ĐÓÒ ÓÓ ÖÔÔÙÙ ÑѺ ØØÓØÝÝÔ ØĐ int, long int, float, double Òºµ ØÚÐРص ÅÈ Å ÆÈ Æº ÈÓÙ ÚÓ ÒØÝĐ Ó ÑØÖ ØØĐĐÒ ÓØÒ Ö¹ ÚØ ÒÓÐÐ Ø ÑÝĐÓ Ó ÒÓÐÐ Ø ÖÓÚ ÐÓØ ÓÒ ÚĐĐÒ ÓÐÐÓÒ ÑØÖ ØÐÐØØ ÓÓÒÒ ÚÒ ÒÓ ØÒ ÒÓÐÐ Ø ÖÓÚØ ÐÓغ ÂØÓ ÓÐØÑÑ ØØĐ ÑØÖ Ò ÐÓØ ÓÚØ ÖÐÐÙÙº ÅØÖ Ó ÒÓÐÐ Ø ÖÓÚ ÐÓØ ÓÒ ÚĐĐÒ ÒÓØÒ Ö¹ Ú Òк ÔÖ µº ËÒ Ú ØÓØ ÓÒ ØĐÝ Òк ÙÐе ÑØÖ ÓÒ ÐÓØ ØÐÐØØÒº ÀÖÚÓÒ ÑØÖ Ò Đ ØØÐÝÝÒ ÓÒ ØØØÝ ÐÓÖØÑ ÓØ ÚÓÚØ ÓÐÐ ÑÖØØĐÚĐ Ø ØÓÑÔ ÙÒ Ú ØÚÒ ØĐÝ Ò ÑØÖ Ò ÐÓÖØÑغ ÅØÖ ÝØĐÐĐÓÒ ¾µ ÖØ Ñ Ò ÝØÝ Đ ØÖ ØÐÑÑ Ù¹ ÖÚ ÓÒÐÑ µ Ü ½ Ô ÑÓÒØ ØĐ Ñµº µ Å Æ Ø ½ Ø µ ËÒÙÐÖÖÚÓÓØÐÑ ÒÙÐÖ ÚÐÙ ÓÑÔÓ ØÓÒ Ëε µ Å Æ ¾µÒ ÔÒ ¹Öغ ÒÓÖÑÐÝØĐÐĐÓغ 2.2. Ratkaisun vaativuus. ÂÓ Ñ Ò ÒÒ ØĐÝÒ ÑØÖ Ò Ø¹ ÔÙ ÝØĐÐĐÓÖÝÑĐÒ ½µ ÖØ ÙÐÐ ØĐÐÐĐ ÙÖ ÐÐ ØØØĐÚĐØ ÐÓÖØÑØ ÓÚØ ÚØÚÙÙÐØÒ ÚØÚÙÙ ÓÑÔÐ ÙÙ ÓÚØ ÝÒÓÒÝÝÑе ÙÙÖÙÙ ÐÙÓ Ò ÙÒ Ø ØÖÓÒÐÑØÖ Ò ØÔÙ ÚØÚÙÙ ÐÙÓ ÓÒ Ò ÐÐĐ ÔÓØÒ ÓÐ ÔÖ ÑÓÐÐÒÒ ØÓÑÑ Ò º ËØÖ ÒÒ ÐÓÖØÑ ÔÓØÒ

88 ÓÒ ÐÓ ¾ ¾¼ ÃÝ ÝÑÝ ØÖ Ø ÐÖ Ø ÝØĐÐĐÓÖÝÑĐÒ ½µ ÚØÚÙÙÐÐ ÓÒ ÚÓÒº ÆÙÑÖÒÒ ÐÒÖÐÖ ÓÒ ÒÙÑÖ Ò ÒÐÝÝ Ò ØĐÖÑÔĐ Ó ¹ÐÓ ÓÚÐÐÙ ØÒ ÒÒÐغ ÎÐØÓ ØØÐÐ Ò Ð ÒÒÒ Ñ¹ ÒØÐÑ ØĐ ĐÝØØĐĐ Ó ÒÒ ÒÙÑÖ Ø ÐÒÖÐÖº ÆÙÑÖ¹ Ò ÐÒÖÐÖÒ ÐÓÖØÑÒ ØÓÙÙ ÓÒ ÒĐÒÓÐÐÒ ØØÐй Ò Ð ÒÒÒ ÔÙÐÐÓÒÙÐÓº Å Ú ÒÙÑÖ Ð ÒÒ ¹ ÝØĐÐĐÓÖÝÑĐØ ÚÓÚØ ĐÐØĐĐ Ñº ¼¼ ¼¼¼ ÑÙÙØØÙº ÆĐÒ Ð¹ ÓÒ ÐÒÖ ØÒ ÝØĐÐĐÓÖÝÑÒ ÖØ Ù ÒÝÝ Ò ØØÓÓÒÒ Ú¹ Ø ØĐ ÑĐÐ ÒØ Ó ÙÓÑÓ ÝØĐÐĐÓÖÝÑĐÒ ÖÒØÒ Ýѹ ÑØÖ ÐÓÓÖÒÒµ ÖØÝ Ø Ò ÓÒÓ ÑØÖ ÖÚº ÄÒÖÐÖÒ ÔÖÙ ÓÔÖØÓØ ÓÒ ÓÓØØÙ Ò º LINPACK Ôع ØÒº ÄÙØØÐÓ ÒÙÑÖ Ò ÑØÑØÒ ÔÙÐ ÓÑÒ ¹ÓÐÑ Ø ÓÒ ØÚÒ ØÓ ØÓÒ Ó ÓØØ Ø ftp://usc.edu/pub/c-numanal/numcomp-free-c.gz º Ò Ò ÑØÖ Ò ÖØÓÐ ÙÒ ÚØÚÙÙØØ ÚÖÖØØÒ ÓÐÐ Ø ÔÓØÒ Ò Ò ËØÒ ÙÖÚ ØÙÐÓ ÓÐÑ mycxty.cppµº Time complexity T(n) of n*n matrix multiplication n T(n) (ms) n^ ÎÓÒ Ó ÓØØ ØØĐ ÚØÚÙÙÐØÒ Ò Ò ÑØÖ Ò ĐĐÒØĐÑÒÒ ÓÒ Ñ ÐÙÓ ÙÒ Ò Ò ÑØÖ Ò ØÙÐÓº 2.3. Esimerkkejä säännöllisistä matriiseista. ÈÐÙØÑÑ ÑÐÒ Ð¹ ÒÖÐÖ Ø ØØĐ ÝØĐÐĐÓÖÝÑĐÐÐĐ ½µ ÓÒ ØÔÙ Ñ Ò Ý¹ Đ ØØÒÒ ÖØ Ù ØĐ ÑĐÐÐÒ ÐÐÓÒ ÙÒ ÑØÖ ÓÒ ĐĐÒÒĐÓÐÐÒÒ Ø º Ø µ ¼ ÅØĐĐÒ ÖØÝ Ò ĐØÚĐĐ ØÓ ĐĐÒÒĐÓÐÐ ÝÝÐÐ ØÙÒÒغ ÅÙÙØÑ ÖÓ ØÔÙ ÖØÚÙÙ Ð ½ Ò Óй Ñ ÓÐÓ ÓÒ ÐÚĐĐ Ø ÒÒ ØÙÒÒØØÙ Ó ÓÒ ÓÒÐÑØÖ ÓÒ ÓÒÐÐÓØ ÓÚØ ÒÓÐÐ ¹ Ø ÖÓÚ ÐÙÙ ÒÒ ½ ÓÒ ÑÝĐÓ ÓÒÐÑØÖ Ó¹ ÒÐÐÓØ ÓÚØ ½

89 Ó ÓÒ ÖÚØØĐÒ ÓÒÐÔÒÓØØÒÒ Ó ÓÒ ÝÐĐ¹ Ø ÐÓÐÑÓÑØÖ ÓÒÐÐÓØ ¼ Ó ÓÒ ÔÓ ØÚ ÒØØ 2.4. Gaussin-Jordanin eliminointi. ÅÒØÐÑĐ ÓÚÐØÙÙ ÝØĐÐĐÓÖݹ ÑĐÒ Ü ½ Ô ÖØ Ñ Òº ÀÝÚĐ ÔÙÓÐ ØÐ Ó ĐÝØØĐĐÒ ØĐÝÐÐ ØĐ ÔÚÓØÓÒØ º Ðе ØÙÓØØ ÑÝĐÓ ½ Ò ÑÒØÐÑĐÒ ØÓÙÙ ÔÖÒ ÔÒ ÑÙÒº ÀÙÓÒÓ ÔÙÓÐ ÓÚÐÐÙ Ó ĐĐÒØ ÑØÖ ½ Óк ÐÒ Đ ØÓ ØØØĐÚĐ Ä͹ÑÒØÐÑĐ ÓÒ ÔÖÑÔº ÇÐÓÓÒ µ Ý µ Æ Æ ÑØÖ Ü Ü ½ Ü Æ µ Ì Đ 1 Æ Æ Ý ĐÓÑØÖ º ËÑÒ Ø ÝØĐÐĐÓÖÝÑĐØ Áµ Ü 1 ½ ¾ ÑÖØĐĐÒ ÐÝÝÑÑÒ ÁÁµ Ü ½ Ü ¾ Ü ½ ¾ 1 ÈÖÙ ÓÑÒ ÙÙ ÁµÐÐ µ ÂÓ ÚØÒ Ò Ò ÁÁÒµ ÚÖÚĐ ÒÒ Ü µ ÑÙÙØÙº µ ÊØ Ù Ü µ ÑÙÙØÙ Ó Ò Ò ÁÁÒµ ÓÒ ÚÖÚ ÓÖÚØÒ ÚÖÚÒ ÐÒÖÓÑÒØÓÐк µ ËÖØØÒ ÚØÓ ÒØ ÑÒ ÖØ ÙÒ ÚÒ Ó Ú ¹ ØÚØ Ü Ø Ò Ú ØÚØ ÖÚØ ÚØÒº

90 Ù Ò¹ÂÓÖÒÒ ÐÓÖØÑ ÁµÒ ÖØ Ñ ÓÐØØÒ ØØĐ ÒØÝÚĐØ Ø ÓÚØ ÒÓÐÐ Ø ÔÓÚ ÓÒ ÙÖÚ ÅÙÓÓ ØØÒ Áµ ØĐ ÙÙ ÝØĐÐĐÓÖÝÑĐ ºº ½º ÖÚ ØÒ ½½ ÐÐĐ ÖÚ ØĐ ½ ÚĐÒÒØĐĐÒ ÐÙÔÖĐÒÒ ½º ÖÚ ÚÓÐÐ ½ ½½ ÖÖÓØØÙÒ ÓÐÐÓÒ Ò ÙÙ ÝØĐÐĐÓÖÝÑĐ ½µ³ ÓÒ ½º ¹ ÖÒ ÖØÓÑØ ÓÚØ Æ ½ ÅÙÓÓ ØØÒ Áµ³ Ø ÙÙ ÝØĐÐĐÓÖÝÑĐ ºº ¾º ÖÚ ØÒ ¼ ¾¾ÐÐ º ÖÚ ØĐ ¾ ÚĐÒÒØĐĐÒ ½µ³Ò ¾º ÖÚ ÚÓÐÐ ¼ ¾ ¼ ¾¾ ÖÖÓØØÙÒ ÓÐÐÓÒ Ò ÙÙ ÝØĐÐĐÓÖÝÑĐ Áµ ¼¼ ÓÒ ¾º ¹ ÖÒ ÖØÓÑØ ÓÚØ Æ ¾ ÌÓ ØØÒ Æ ÖØ µ Ò Ü ÁÜ ¼ Pivotointi. ÆÙÑÖ Ò ØÖÙÙÒ ÔÖÒØÑ ÓÒ ØÓØØÙ ØÖ¹ ÔÐÐ ĐÝØØĐĐ ÔÚÓØÓÒØ ØÙÒص Ø º ÖÚÒ ÑÓÐÐ Ø Ð Đ ÖÒ ÚØÓ ºº Ù Ò Ú ØÙÐ ÓÒ ÖØÝ Ò ØÓÚÓØØÚ ÐÙÙ Ó ØÔÙ ¼µº ÑÖ Ó Ú Ô ÑØÖ Ò ÖØÓÑØ ÓÚØ Ôµ µ ÒÒ ÚÓÒ ÚÐØ ØÙÐÓ ÙÙÖÒ ÐÙÚÙ Ø Ôµ Ô Ø Ôº ÌÓÒÒ Ñ¹ ÓÐÐÒÒ ÚÐÒØ ÓÒ ÑÔÐ ØØÒÒ ØÙÒØ Ó ÒÒÒ ÐÑÒÓÒÒÒ ÐÓØØÑ Ø ÙÒ ÝØĐÐĐÓ Ö Ò ÖÖÓØÒ ÔÙÓÐØØÒ ÐÐ ÐÐ ÐÙÚÙÐÐ ØØĐ Óº ÖÚÒ Ø ÖÚÓÐØÒ ÙÙÖÑÑ ÖØÓÑ ØÙ¹ Ð ½º à º ÐÑ NR::gaussj º ÜÑÔÐ ÓÓ º º 2.5. Gaussin eliminointi takaisinsijoituksella. ÅÙÙØÒ Ñ ÙÒ Ù Ò¹ ÂÓÖÒÒ ÐÓÖØÑ ÑÙØØ Ú ÚĐÒØĐÑÒÒ Ó ØÙÙ ÔÐĐ ØĐĐÒ ÝØĐÐĐÓÒ ÄÓÔÔÙØÐÒØ ÝØĐÐĐÓÖÝÑĐ ÓÒ ØØØÙ ÑÙÓ¹ ØÓÓÒ Ó ÑØÖ Ò ÓÒÐÒ ÐÔÙÓÐ Ø ÐÓØ ÓÚØ ÒÓй Ð

91 ¾ ¼ ½½ ¼ ½¾ ¼ ¾ ½Ò Ü ¼ ¼ ¾¾ ¼ ½ ¾Ò Ü º º º ¾ º ¼ ¼ ¼ ÒÒ Ü Ò ¾ ¼ ½ ¼¾ º ¼ Ò ÌĐØĐ ØÝÝÔÔĐ ÓÐÚ ÑØÖ ÚÓÒ ÐÔÓ Ø ĐĐÒØĐĐ ÐÓØØÑй Ð ÐÖÚÐØĐ ÙØÒ Ó ÑÑÒ ÒĐØÒº ÎÑ ØĐ ÝØĐÐĐÓ ØĐ ¹ Ò Ü Ò ¼ Ò ¼ ÒÒ ÎÑ ØĐ ÐÐ ØĐ ÖØ ØÒ Ü Ò ½ Òº Ź ÒØØÐÝ Ó ÒØ ÐÙÚÙØ Ü Ò Ü Ò ½ Ü ½ ÓÒ ÒÑÐØĐĐÒ Ø Ò ¹ ÓØÙ Òк Ù ØØÙØÓÒµº Ù Ò ÐÓÖØÑ Ó Ú ÖÐÐ ÙÙ ÓÒ ÖØØĐÒ Ð Ð¹ ÓÖØÑÒ Ö ÚÖ ÓØ ØØĐĐÒ ÐÐÒº ËØĐ ÓÒ ØØØÝ ÑѺ ÐÓÓÑÙÓØÓ ÐÐ ÑØÖ ÐÐ ÓÔÚ ÚÖ ÓØ ØÙØØØÙ ÖÒÒ ¹ Ð ÒÒÒ ÒĐĐÓÙÐÑ Øº 2.6. LU-hajoitelma. ÇÐØØÒ ØØĐ ÒÐĐÓÑØÖ ÚÓÒ Ö¹ ÓØØ ÑÙÓØÓÓÒ Ä Í Ñ Đ Ä ÓÒ ÐÓÐÑÓÑØÖ ÓÒÐÒ ÝÐĐÔÙÓÐ Ø ÐÓØ ÓÚØ ÒÓÐе Í ÓÒ ÝÐĐÓÐÑÓÑØÖ ÓÒÐÒ ÐÔÙÓÐ Ø ÐÓØ ÓÚØ ÒÓÐе ÓÒÐÐÓØ ÒÓÐÐ Ø ÖÓÚº Óº ØÝÝÔÔĐ ÓÐÚÒ ÑØÖ Ò Ä Í ĐĐÒØĐÑÒÒ ÓÒ ÐÔÔÓ ÙØÒ Ó Ù Ò ÐÑÒÓÒÒÒ ÝØÝ Đ ØÓØ ÑѺ ÄÒÖÒÒ ÝØĐÐĐÓÖÝÑĐ Ü ÚÓÒ ÖÓØØ ÑÙÓØÓÓÒ ½µ Ü Ä ÍµÜ Ä Íܵ ÊØ Ù ØĐĐÒ Ú ÒÒ ØØĐ Ò Ò Ø ØĐĐÒ Ý ºº ¼ ¾µ ÄÝ Ä «µ ½ ØĐÑĐÒ ĐÐÒ Ø ØĐĐÒ Ü ºº µ Í Ü Ý Í µ ÆÝØ ½µ ÓÒ ÓØØØÙ ÝØĐÐĐÓÖÝÑĐ ¾µ µº ¼

92 ËÚÙØØØÙ ØÙ ÐĐ¹ ÐÓÒÐ ØÒ ÝØĐÐĐÓÖÝÑÒ ¾µ µ ÖØ Ù ÓÒ ÐÔÔÓ Ù Ò ÐÑÒÓÒØ Ø Ò ÓØÙ Ðеº µ 2.7. LU-hajoitelman muodostaminen. ÅØÖ ØÙÐÓÒ Ú Ø Ò Ä͵ Ò Äµ ͵ Ò «½ ½ µ «½ ½ «¾ ¾ «Ä͵ µ «½ ½ «¾ ¾ «µ «½ ½ «¾ ¾ «ØĐÐĐÓÖÝÑĐ Đ µ ÓÒ Æ ¾ ÝØĐÐĐÓĐ Æ ¾ Æ ØÙÒØÑØÓÒØ «º ÆĐ ØĐ ÚÓÒ Æ ÔÐ ÒÒØØĐĐ ÑÐÚÐØ Ø ÖØ Ø ÑÙÙغ ËÙÖÚ ÐÓÖØÑ ÒÒØØĐĐÒ ÓÒÐÐÓØ µ «½ ½ Æ Croutin algoritmi. ÐÑ ÒØ ÐÙÚÙØ «ÙÖÚ Ø µ ØØÒ «½½ ½ ½½ ½½ µ ÂÓ ÐÐ ¾ Æ ØĐĐÒ ÙÖÚØ ¾ ÓÔÖØÓغ ÃÙÒ ½ ÖØ ØÒ µ ² µò ÒÓÐÐ ½ ½ «µ ÙÒ ½ Æ ÖØ ØÒ µò ÒÓÐÐ «½ ½ ½ «µ µ ÖÓÙØÒ ÐÓÖØÑ ÒÖÓ ÑØÖ Ò ¾ ½½ ½Ò «¾½ ¾Ò º º «Æ½ ÆÆ ½

93 ÖØØÒ Ú ÑÑÐØ ÓÐÐ ÙÒÒ ÖÒ ÝÐĐĐÐØĐ Ð º ÖÓÙØÒ ÐÓÖØÑÒ ÝØÝ Đ ØÙÒØ ÓÒ ÓÐÒÒ Ø Ø º ÝÐÐĐÓй Ú ÐÓÖØÑ ÓÒ ÚÐĐ ØĐÐØĐ Ó Ò ØĐÝÒÒØØĐÚĐº Ç ØØÒÒ ØÙÒØ ÖÚÒ ÚØÓµ ÓÒ ÖÒ ÐÓÖØÑ NR::ludcmp º µ ØÓØØÙ ÖØØĐÚĐ º Olemassaolo. Ä͹ÓØÐÑ ÓÐ ÓÐÑ ÐÐ ĐĐÒÒĐÓÐÐ ÐÐ ÒÐĐÓÑØÖ Ðк ÃÙØÒÒ ĐĐÒÒĐÓÐÐ ÐÐ ÑØÖ ÐÐ ÓÒ ÓÐÑ ÐÐÒÒ ÔÖÑÙØØÓÑØÖ È ØØĐ È ÐÐ ÓÒ Ä͹ÓØÐѺ ÃÙÒ Ä͹ÓØÐÑ ÓÒ ØØÝ ÓÐÑÒ NR::ludcmp ÚÙÐÐ ÚÓ¹ Ò ÝØĐÐĐÓÖÝÑĐÒ ÖØ Ù ØÓØÙØØ ÐÓÖØÑÐÐ NR::lubksb º µº Matriisin kääntäminen LU-hajoitelmalla. Ä͹ÓØÐÑÒ ÚÙÐÐ Ñع Ö Ò ĐĐÒØĐÑÒÒ ÔÐÙØÙÙ ÝÐĐ¹ ÐÓÒÐ ØÒ ÑØÖ Ò ĐĐÒØĐÑ ÓÒ ÐÔÔÓ Ù Ø Ò ÓØÙ Ðеº Çй ÓÓÒ ÒÒØØÙ Ò Ò ÑØÖ Ý ĐÓÑØÖ Ö Ý ÃÙÐÐÒ ÖØ ØÒ ÄÍÜ Ý NR::lubksbÒ ÚÙÐÐ Óй ÐÓÒ Ò Ü º ÆÝØ ½ Ü ½ Ü Ò ÃÙÖ Ò ÑØÖ ÔØ matutl02.cpp ÑØÖ ÒĐĐÒØĐÓ ØØÒ NR::gaussjÒ ÚÙÐк 2.8. Matriisin determinantti. Ä͹ÓØÐÑÒ ÒÒØÙÒ ÑØÖ Ò ØÖÑÒÒØØ ÚÓÒ ÐÑ Ø ØÙÐÓÒ ½½ ÆÆ º ÂÓ ĐÝØØĐĐÒ ÙØÒ ÖÒ ÓÐÑ µ ØÙÒØ ÒÒ ÖÚÒ ĐÖ ØÝ ÓÒ Đ ÑÙÙØØÙÒÙØ ÑÝĐÓ ØÖÑÒÒØÒ ÑÖ ÓÒ ÚÓÒÙØ ÑÙÙØØÙ ß ÒĐÒ ĐÝ Ó ÚØÓÒ ÐÙÙÑĐĐÖĐ ÓÒ ÔÖØÓÒº ØÖѹ ÒÒØØ Ò ÙÖÚ Ø DP t; NR::ludcmp(aa,indx, t); /* Returns t = +1 or -1 */ for (int j=0;j<n;j++) t = t*aa[j][j]; return t; 2.9. Tridiagonaalinen yhtälöryhmä. ËÒÓØÒ ØØĐ ÑØÖ ÓÒ ØÖ¹ ÓÒÐÒÒ Ó Ò ÒÓÐÐ Ø ÖÓÚØ ÐÓØ ÓÚØ ½º ÌĐÐÐÒÒ ÑØÖ ÓÒ ØĐÖĐ ÑÖ ÖÚ Ø ÑØÖ Øº ÃÓ ¾

94 ÖÚÓÒ ÑØÖ Ò ÐÓ Ø ÙÙÖÒ Ó ÓÒ ÒÓÐÐ ÓÒ ØÖÓØÙ Ò¹ ÑÙ Ø ĐÝØØĐĐ ÝÚĐ ØĐØĐ ØØÓ ÑØÖ ÖØÓÐ Ù ÑÙ ¹ ÑØÖ ÐÖÒ ÓÔÖØÓ Đ ÑÝĐÓ ØÒ ØØĐ ØÐÐØØÒ ÚÒ ÒÓÐÐ Ø ÖÓÚØ ÐÓغ ÐÓÖØÑ NR::tridag º ½µ ÖØ ØÖÓÒÐ Ò ÝØĐÐĐÓ¹ ÖÝÑĐÒ Ñº ÒĐĐÓÓØ ÙÓÑÓÒº Jälki-iterointi. ÇÐØØÒ ØØĐ Ü ØÙÒÒØÒ Ü ÆÜ ÆÜ ÚÖµ ÓÐÐÓÒ Ü Æܵ Æ µ ÆÜ Æ Ü Æܵ ÄÖÚÓÒ ÔÖÒØÑ ØĐ ØĐ ÚÓÒ ÖØ Ø Æܺ ËÒ Ü Ü ÆÜ Æܺ ÐÓÖØÑ NR::mprove º µ ĐÝØØĐĐ ØĐØĐ º Singulaariarvohajoitelma (SVD). ØØÐÑÑ ÒÝØ ÐÑÒ ØÓ¹ ØÙ ÙØÒ ØÚÐÐ Ø ÖĐĐÒ ÑØÖ ÓØÐÑÒ ÓÒ ÚÙй Ð Ò ÑÓÒÔÙÓÐ Ø ØØÓ ÑØÖ Ò ÒÙÑÖ Ø ÓÑÒ ÙÙ¹ غ ÌĐÑĐ ÑØÖ ÓØÐÑ ËÎ ÓÒ ØØÓÓÒÒ ÝÐ ØÝ Đ ÒÓÙ ÙØ Ò ÑÒ ÒÙÑÖ ÐÒÖÐÖ ÑÙØØ ØĐ ÚĐÐØØĐÑĐØØĐ ØØĐ ÐÒÖÐÖÒ ÔÖÙ ÙÖ Ðк ÐÙ ÔÐÙØÑÑ ÑÐÒ ØØĐ Ñ Ò ÑØÖ Ò µ ØÖÒ ÔÓÓ Ì ÓÒ Ò Ñ ÑØÖ Ì µ º Ñ Ò ÑØÖ ÓÒ ÖØØÒ ÓÖØÓÓÒÐÒÒ Ó Ò ÖØ ÓÚØ ÓÖØÓÓ¹ ÒÐ º ÆÐĐÓÑØÖ ÓÒ ÓÖØÓÓÒÐÒÒ Ó ÓÒ ĐĐÒÒĐÓÐÐÒÒ Ø º Ø µ ¼µ Ì ½ º ËÙÖÚÒ ØĐÖĐÒ ÐÙ Ò ØÓ ¹ ØÙ ÐĐÓÝØÝÝ ÔÑÑĐÐÐ ÑÒÚ ØĐ ÒÙÑÖÒ ÓÔÔÖÓ Ø Ñº ËØÓÖ¹ÙÐÖ º ¾¹ ÄÙ ºº½¼ Ø ÓÐÙ¹ÎÒ ÄÓÒ º ½ ÄÙ ¾ºº½º Lause (SVD). ÊÐ ÐÐ Ñ Ò Ñ Ò ÑØÖ ÐÐ ÓÒ ÓÐÑ ÖØØÒ ÓÖØÓÓÒÐÒÒ Ñ Ò ÑØÖ Í ÓÖØÓÓ¹ ÒÐÒÒ Ò Ò ÑØÖ Î ºº ÍÏ Î Ì Ñ Đ Ï ÓÒ Ò Ò ÓÒÐÑØÖ º ÂÓ Ï Û ½ Û Ò µ ÒÒ Û ½ Û ¾ Û Ò ¼º

95 ÄÙ ¾º½¾ Ú ØÒÒ ÙÙÒÒÐÐÒ ÐÑÒ NR::svdcmp ĐÐØĐÓĐß ÚÐØØØÚ Ø ØĐØ ÚĐØ ÓÐ ØĐ ÑĐÐÐ Ø ÐÑ Ø ÑØĐ Óº ÐÑ Øº ÅØÑØØ ÖÐÐ ÙÙ ØÙÐÓ ÓÖÑÙÐÓÒ Ó Ù ÑÒ ØÓ Ò Í Î ÓÚØ Ñ Ñ Ò Ò ÓÖØÓÓÒÐÑØÖ Ï Ñ Ò ÓÒÐÑØÖ Ð Đ ØÓ Ñ Ò ÓÒ ÔĐÓÐÐÐÒÒº Çй Ñ NR::svdcmp ÚÖ Ó ¾º¼µ ØÙÓØØ ÝÓº ØÝÝÔÔĐ ÓÐÚÒ ÓØй ÑÒ ÑÙØØ ÒĐ ÒÙÐÖÖÚÓØ ÚĐØ ÓÐ ÚÚ ĐÖ ØÝ Đº ÓÒÐÑØÖ Ï Ò ÐÓØ ÓÚØ Ò ÒÙÐÖÖÚÓº ËÒĐ ØÔÙ ØØĐ ÓÒ Ò Ò ÒÐĐÓÑØÖ ÒÙÐÖÖÚÓØ ÓÚØ ÒÓÐÐ ÙÙÖÑÔ ÑĐĐÖØÐÐĐĐÒ Ò ÙÒØÓ ÙÙ ÐÙÙ Ð٠й Ð ÓÒ µ ÛÑÜÛÑÒ Ñ Đ ÛÑÜ ÛÑÒ ÓÚØ Ú ØÚ Ø ÙÙÖÒ ÔÒÒ ÒÙй ÖÖÚÓº ÌÔÙ Ø µ ¼ ÓÒ ÓÒ µ ÚÒØØØÚÒÒ ÑØØ Ð¹ Ð ÙÒ Ô ÓÒ ÒÙÑÖ ÐØ ÓÑÒ ÙÙ ÐØÒ Ø ÙÒ ÐĐÐÐĐ ÓÒ ÒÙÐÖ Ø ÑØÖ º ÎĐÐÙÓÑÙØÙ Ø µ ÓÐ ÓÔÚ ÑØØ ØĐĐÒ ØÖÓØÙ Ò ÐÐĐ ÓÚØ ÒÙÑÖ Ð¹ Ø ÓÑÒ ÙÙ ÐØÒ ÑÒÚÖÓ ÙÒ Ø Ø µ Ò Ø µ Ó ÓÒ Ò Ò ÑØÖ ¾ ʵ ÐÐ Đ ÐÙÚÙ ØØÐÑÑ Ó ÑÒØØÐÝÒ ÐÐ ÑØÒ cond( ) ÚÓÒ Ð ÖÒ ÐÓÖع ÑÒ svdcmp ÚÙÐк Ò Ò ÝØĐÐĐÓÖÝÑĐÒ ÖØ Ù ÚÓÒ ØĐ ĐÝØØĐÒ ÐÓÖØÑ NR::svdcmp NR::svbksbº ÂÓ Ñ Ò ¹ Ò ÖØ Ù ÔÒÑÑĐÒ ÒÐĐÓ ÙÑÑÒ ÑÐ Đº Pseudoinverssi. ÊÐÐÙÚÙÒ ¼ Ô ÙÓÒÚÖ ÓÒ ½ ¼Ò Ô ÙÓÒÚÖ ÓÒ ¼ ÓÒÐÑØÖ Ò Ï Ô ÙÓÒÚÖ Ï Ðº ÚÐĐĐÒØ ÑØÖ µ Ò ØÖÒ ÔÓÒÓÑÐÐ ÑØÖ ÓÖ¹ ÚÑÐÐ ÓÒÐÐÓØ Ô ÙÓÒÚÖ ÐÐĐĐÒº Ð Ò Ñ Ò Ñ Ò ÑØÖ Ò ÓÐÐ ÓÒ ÒÙÐÖÖÚÓÓØÐÑ ÍÏ Î Ì Ô ÙÓÒ¹ ÚÖ ÓÒ Ò Ñ ÑØÖ Î Ï Í Ì ËÒĐ ØÔÙ ØØĐ ÓÒ ¹ ÒÙÐÖÒÒ ÒÐĐÓÑØÖ Ò Ô ÙÓÒÚÖ ÓÒ Ñ ÙÒ ½ à ØÔÙ ÝØĐÐĐÓÖÝÑĐÒ Ü ÈÆ˹ÖØ Ù ¹ Ò Ú Ø Ü

96 È ÙÓÒÚÖ Ñº ÓÒ ÑÙ Ø ØÔÙ Ñ Ò ÓÒ ÑÔÐÑÒØÓØÙ ÔØØÒ solve.cpp Ó ØÐÐĐĐÒ ÐÑÔÒº È ÙÓÒÚÖ ÓÒ ÓÐÑ ÑÝĐÓ ØÔÙ Ñ Ò ÑÙØØ Ñº Ò ÔÓÙØÙÚ ÑÔÐÑÒØÓÒØ ÒĐÝØĐ ÓÒÒ ØÙÚÒº ËĐ ÆÊ ØØĐ ËÄ ÚĐØ ÙÑÔÒ ÒÓ ÙÙÖ ÑØĐĐÒ ØĐ ØĐ ØÔÙ ¹ غ ÇÒÒ ØÙÑ ÖØÖÒĐ ÚÓ ÔØĐĐ ÐÐÑÒØØÙ ÅÓÓÖÒ¹ÈÒÖÓ Ò ØÓ µ¹ µ ÓØ ÖØÖ ÓÚØ Ô ÙÓÒÚÖ Òº ÌÔÙ Ò Ñ Ò ÐÚØØĐÑ ÔÐÑÑ Ò Ò ØÔÙ Ò Ñ Ò ÇÐØÑÑ ØØĐ Ñ Ò Ò Ö ØÐÙÙ ÓÒ Ò Ø º ØØĐ Ò ÖÚØÓÖØ ÑÙÓÓ ØÚØ ÐÒºÖÔÔÙÑØØÓÑÒ ÓÙÓÒº ËÐÐÓÒ ÚÓÒ ÐÔÓ Ø Ó ÓØØ ØØĐ Ì ÓÒ ÔÓ ØÚ Ø ÒØØ ĐĐÒØÝÚĐº غÖÝÑĐ Ü ÚÓÒ ÖÓØØ Ì Ü Ì ÖØ Ø ÚÐÐ ¾½ µ Ü Ì µ ½ Ì Ó Ø ÔĐĐØÐÐĐĐÒ ØØĐ Ì µ ½ Ì ËÒĐ ØÔÙ ØØĐ Ñ Ò ÑÒØÐÐĐĐÒ Ú ØÚ Ø ÓÐØØÒ ØØĐ Ò ÖÚ ØÐÙÙ ÓÒ Ñ ÓÐÐÓÒ Ì Ò Ö ØÐÙÙ ÓÒ Ñµº ËÓÚÐØÒ ÐÐĐÓÐÚ Ì Ò ØÓØÒ ØØĐ ÓÒ ÓÐÑ Ì µ Ì Ì µ ½ Ì µ ½ ÓØÒ Ü ÚÓÒ ÖÓØØ ÑÙÓØÓÓÒ Ó Ø Ü Ì µ Ì µ ½ ¾½ µ Ü Ì Ì µ ½ ØĐÒ ÝÐÐĐÓÐÚØ ÚØ ØÓØÒ ØØĐ Ó ÐÐ Ñ Ò Ñع Ö ÐÐ ÓÒ ØÐÙÙ ÔÒÑÔ ÖÚ ØÐÙÚÙ Ø Ö ØÐÙ¹ Ú٠ص ÓÒ ÑÒÑ Ò ÚÓÒ Ô ÙÓÒÚÖ ÓÒ ØÖÙÓ ÚÓÐÐ ¾º½ µ ¾º½ µº ÌÓ ØÓÒ solve.cpp Ó Ò ÓÐÚ pseudoinv ØÙÓØØ Ñ Ò Ñع Ö Ò Ô ÙÓÒÚÖ Ò Đ ØÔÙ Ñ Ò ØØĐ Ñ Ò ÐÑÒ pseudoinv ØÓÑÒØ ÅÓÓÖ¹ÈÒÖÓ Ò ÝØĐÐĐÓÒ ÔĐØÑ ØĐ Ñع Ö ÔÖÐÐ Ø ØØÒ ÓÐÑÐÐ mypseudo.cpp Ó ÓÒ ÛÛÛ¹ ÚÙÐк

97 2.14. Moore-Penrosen ehdot. ÎÓÒ Ó ÓØØ ØØĐ ÑØÖ ÓÒ Ò Ô ÙÓÒÚÖ Ó ÚÒ Ó ØÓØÙØØ ÙÖÚØ ÓØ µ µ µ µ Ì µ µ Ì Singulaariarvojen editointi. ÆÊ ØØĐĐ ÙÖÚÒ Ò ÒÙ¹ ÐÖÖÚÓÒ ØÓÒÒÒ ĐÝØØĐÑ ØĐ Ò Ò ÝØĐÐĐÓÖÝÑĐÒ Öع Ù ØÔÙ Ó cond( ) ÓÒ ÙÙÖº Ò Ò ÑÙÓÓ ØØÒ ÒÙÐÖÖÚÓÓØÐÑ ÒÒØØĐĐÒ ÓÒ ÔÒ ÐÙÙ ØÓÒ¹ ØÝÒÒÝ ÌÁÆ Ñº ½¼ µº ÀÙÓÑØÒ ØØĐ Î ½Û µ Í Ì ËÙÖÚ ÓÖÚØÒ ÒÓÐÐÐÐ ÐÐ Ø ÒÙÐÖÖÚÓØ Û ÓØ ÓÚØ ÔÒÑÔĐ ÙÒ Ì ÁÆ Û ÑÜ Ñ Đ Û ÑÜ ÓÒ ÙÙÖÒ ÒÙÐÖÖÚÓ Øº ÌĐÑĐ ÆÊÒ ÙÙÐÓ Ø ÔÖÓ Ð ÐØ ÑÙØØ ÐÐ ÓÚØ ÔÖÙ ØÒ Ô ÙÓÒÚÖ Ò ÖĐĐØ ÓÑÒ ÙÙغ ÌĐÑĐÒ ĐÐÒ ÖØ Ù ØÒ ÙØÒ ÐÐĐ ÐÓÖØÑÒ svdcmp svbksb ÚÙÐк ÄÙ ÚÓ ÐÙØ Ò ÓÐÐ Ø ÚÖÑ ØÙ Ò ÝĐÓÝÐÐ ÝÝ ØĐ Ñº ØÔÙ Ó ÝØĐÐĐÓÖÝÑĐÒ ÑØÖ ÓÒ Ò Ò ÀÐÖØÒ ÑØÖ ÐÓÒ ½ ½µ Esimerkki. ØĐÐĐÓÖÝÑĐÐÐĐ ¼ ¾¼¼¼Ü ¼Ý ¾¼¼¼ ½¼¼¼Ü ¼ Ý ½¼¼¼ ÓÒ µ ½¼ ÓÒ ½ßĐ ØØÒÒ ÖØ Ù Ü ½¼¼¼ Ý ¼¼¼¼º ËÒ Ò ÝØĐÐĐÓ¹ ÖÝÑĐÐÐĐ ¼ ¾¼¼¼Ü ¼Ý ¾¼¼¼ ½ ¾ ¾¼¼¼Ü ¼Ýµ ½¼¼¼ ÓÒ ĐĐÖØØĐÓÑĐÒ ÑÓÒØ ÖØ Ù ¼ Ü ½¼¼¼ ¼ Ý ¾ Ê ½

98 ÀÙÓÑ ØØĐ ÓÒ µ ÓÒ ÙÙÖ ØÒ ØØĐÚĐ ÔĐ Øк Yhteenveto NR:n yhtälöryhmän ratkaisualgoritmeista. ØĐÐĐÓ¹ ÖÝÑĐÒ ÖØ Ù ÝÐÒ Đ ØÖÚØ ĐĐÒØ ÑØÖ º ÆÊ ÙÓ Ø¹ Ø Ä͹ÑÒØÐÑĐÒ ĐÝØØĐÓĐ ÐÒÖ Ò ÝØĐÐĐÓÖÝÑĐÒ ÖØ Ù ¹ º ÐÐÓÐÚ ÓÐÑ mysolve Ò ÐØØÝÚĐ ÔØØ solve.cpp ĐÐØĐÚĐØ ÝØÒÚÓÒ ÆÊÒ ÖÐ Ø ÖØ ÙÑÒØÐÑ ØĐ GJsolve LUsolve SVDsolveµº ÆĐ ØĐSVDsolve ĐÐØĐĐ ÒÙÐÖÖÚÓÒ ¹ ØÓÒÒÒ ÒØĐÐÐĐ ØÓÒØÝÒÒÝ ÐÐĐº SVDsolve2 ØÓÒØÝÒ¹ ÒÝ Ò ÚÓ ÒØ ÔÖÑØÖÒº ÌÙÐÓ ØÙ Ø ÐÑÒ ØØĐ ÚÖ ÓÒ ØÔÙ ÒÓÒ ÐÙÓ ½¼ ½ /* FILE: mysolve3.cpp begins. */ #include <cstdlib> #include <cstdio> #include <ctime> using namespace std; #include "nr.h" #include "matutl02.h" #include "solve.h" void DoTest(int n) time_t time1, time2; int i,m; m=500; /* 1000 nxn lin. equations are solved. difftime returns time in seconds, hence for T(n) the unit is millisecond, ms */ Mat_DP a(n,n), atmp(n,n); Vec_DP rhs(n),sol(n), err(4), tmp(n), d(4); ranmat2(a,-1.0,1.0); atmp=a; sol=1.0; matvecmul(a,sol,rhs); /* We build a system a*x = rhs with the exact solution x= 1. */ time1=time(null); for (i=0;i<m; i++) GJsolve(atmp,rhs,sol); time2=time(null); for (int ii=0;ii<n;ii++) tmp[ii]=sol[ii]-1;

99 err[0]=vnormp(tmp,2.0); d[0]= difftime(time2,time1); atmp=a; time1=time(null); for (i=0;i<m; i++) LUsolve(atmp,rhs,sol); atmp=a; time2=time(null); for (int ii=0;ii<n;ii++) tmp[ii]=sol[ii]-1; err[1]=vnormp(tmp,2.0); d[1]= difftime(time2,time1); atmp=a; time1=time(null); for (i=0;i<m; i++) SVDsolve(atmp,rhs,sol); time2=time(null); for (int ii=0;ii<n;ii++) tmp[ii]=sol[ii]-1; err[2]=vnormp(tmp,2.0); d[2]= difftime(time2,time1); atmp=a; time1=time(null); for (i=0;i<m; i++) QRsolve(atmp,rhs,sol); time2=time(null); for (int ii=0;ii<n;ii++) tmp[ii]=sol[ii]-1; err[3]=vnormp(tmp,2.0); d[3]= difftime(time2,time1); printf("%4d %8.2lf %8.2lf %8.2lf %8.2lf %10d\n", n, d[0], d[1], d[2],d[3],n*n*n); printf("err= %8.2e %8.2e %8.2e %8.2e \n", err[0], err[1], err[2],err[3]); int main(void) init_srand(); printf("\ntime complexity of n*n linear system solution\n"); printf(" n GJsolve LUsolve SVDsolve QRsolve (ms) n^3\n"); for (int j=1;j<7;j++) DoTest(j*10); return 0; /* FILE: mysolve3.cpp ends. */ /* Time complexity of n*n linear system solution

100 n GJsolve LUsolve SVDsolve QRsolve (ms) n^ err= 3.42e e e e err= 2.60e e e e err= 5.12e e e e err= 2.32e e e e err= 1.14e e e e err= 2.29e e e e-14 */ /* FILE: solve.cpp begins. */ /* Last updated: */ #include "matutl02.h" #include "solve.h" #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; void GJsolve(Mat_DP &a, Vec_DP &b, Vec_DP &x) /* If a is nxn and b is nx1 this returns the solution x of a*x=b */ int ma=a.nrows(), na=a.ncols(), mb=b.size(),mx=x.size() ; if ((ma!=na) (ma!=mb) (ma!=mx)) cout<<"matrix/vector dimension error in QRsolve. " <<endl; abort(); int n=ma; Vec_INT indx(n); Mat_DP ac(n,n), sol(n,1); ac=a; for (int j=0;j<n;j++) sol[j][0]=b[j]; NR::gaussj(ac,sol);

101 for (int j=0;j<n;j++) x[j]=sol[j][0]; void LUsolve(Mat_DP &a, Vec_DP &b, Vec_DP &x) /* If a is nxn and b is nx1 this returns the solution x of a*x=b */ int ma=a.nrows(), na=a.ncols(), mb=b.size(),mx=x.size() ; if ((ma!=na) (ma!=mb) (ma!=mx)) cout<<"matrix/vector dimension error in QRsolve. " <<endl; abort(); int n=ma; DP p; Vec_INT indx(n); Mat_DP ac(n,n); Vec_DP sol(n); ac=a; sol=b; NR::ludcmp(ac,indx,p); NR::lubksb(ac,indx,sol); x=sol; void QRsolve(Mat_DP &a, Vec_DP &b, Vec_DP &x) /* If a is nxn and b is nx1 this returns the solution x of a*x=b */ int ma=a.nrows(), na=a.ncols(), mb=b.size(),mx=x.size() ; if ((ma!=na) (ma!=mb) (ma!=mx)) cout<<"matrix/vector dimension error in QRsolve. " <<endl; abort(); Vec_DP c(ma), d(ma); Mat_DP ac(ma,ma); ac=a; bool sing; NR::qrdcmp(ac, c, d, sing); if (sing ==1) cout<<"singularity in qrdcmp"<<endl; abort(); x=b; NR::qrsolv(ac,c,d,x); ½¼¼

102 void SVDsolve(Mat_DP &a, Vec_DP &b, Vec_DP &x) /* If a is mxn and b is mx1 this returns the LSQ-solution x of a*x=b Singular value w[i] is set = 0 if w[i]/maxw[k]< 1e-6; */ int ma=a.nrows(), na=a.ncols(), mb=b.size(),mx=x.size() ; if ((na!=mx) (ma!=mb)) cout<<"matrix/vector dimension error in SVDsolve. " <<endl; abort(); Vec_DP w(na), c(ma), xnum(na); Mat_DP u(ma,na),v(na,na); u=a; c=b; NR::svdcmp(u,w,v); // find maximum singular value DP wmax=0.0, wmin; for (int k=0;k<na;k++) if (w[k] > wmax) wmax=w[k]; // define "small" wmin=wmax*(1.0e-6); // zero the "small" singular values for (int k=0;k<na;k++) if (w[k] < wmin) w[k]=0.0; NR::svbksb(u,w,v,c,xnum); x=xnum; void SVDsolve2(Mat_DP &a, Vec_DP &b, Vec_DP &x,dp eps_edit) /* If a is mxn and b is mx1 this returns the LSQ-solution x of a*x=b Singular value w[i] is set = 0 if w[i]/maxw[k]< eps_edit; */ ½¼½

103 int ma=a.nrows(), na=a.ncols(), mb=b.size(),mx=x.size() ; if ((na!=mx) (ma!=mb)) cout<<"matrix/vector dimension error in SVDsolve. " <<endl; abort(); Vec_DP w(na), c(ma), xnum(na); Mat_DP u(ma,na),v(na,na); u=a; c=b; NR::svdcmp(u,w,v); // find maximum singular value DP wmax=0.0, wmin; for (int k=0;k<na;k++) if (w[k] > wmax) wmax=w[k]; // define "small" wmin=wmax*(eps_edit); // zero the "small" singular values for (int k=0;k<na;k++) if (w[k] < wmin) w[k]=0.0; NR::svbksb(u,w,v,c,xnum); x=xnum; void psinv(mat_dp &a, Mat_DP &pia) /* psinv is used by pseudoinv to form the pseudoinverse of a matrix */ int ma=a.nrows(), na=a.ncols(), mb=pia.nrows(),nb=pia.ncols() ; if ((ma>na) (mb!=na) (nb!=ma)) cout<<"matrix/vector dimension error in psinv2. " <<endl; abort(); Mat_DP a1(ma,ma),a2(ma,ma), at(na,ma),a3(na,na),a4(na,na); transp(a,at); a3=at*a; void pseudoinv(mat_dp&,mat_dp&); pseudoinv(a3,a4); /* psinv2 calls pseudoinv with m=n */ pia=a4*at; ½¼¾

104 void pseudoinv(mat_dp &a, Mat_DP &pia) /* If a is mxn matrix, then pia will be nxm, the pseudoinverse of a. */ int ma=a.nrows(), na=a.ncols(), mb=pia.nrows(),nb=pia.ncols() ; if ((na!=mb) (ma!=nb)) cout<<"matrix/vector dimension error in pseudoinv. " <<endl; abort(); if (ma<na) psinv(a,pia); else Vec_DP w(na); //, c(ma), xnum(ma); Mat_DP u(ma,na),v(na,na),wi(na,na); u=a; wi=0.0; NR::svdcmp(u,w,v); for (int i=0;i<w.size();i++) wi[i][i]= w[i]*w[i]>1e-16? 1.0/w[i]: 0; Mat_DP ut(na,ma); transp(u,ut); Mat_DP tmp(na,ma); tmp=wi*ut; pia= v*tmp; /* FILE: solve.cpp ends. */ Ѻ QRsolve ÓÒ ØÓØÙØØØÙ ÆÊ ÐÑÒ ÔÓÐØß Ú ØÚ Ó¹ ØÙØÓÒÒ ÐÑ ÓÒ ÓÐÑ myhouse2.cpp Residuaali ja kuntoisuusluku. ÂÓ Ü ÓÒ ÝØĐÐĐÓÖÝÑĐÒ Ü ÖØ ÙÒ ÔÔÖÓ ÑØÓ ÒÒ ØÙÒØÙÙ ÐÙÓÒÒÓÐÐ ÐØ ØÐÐ ØØĐ Ó Ö ÙÐ Ö Ü ÓÒ ÔÒ ÒÒ ÑÝĐÓ Ü Ü ÓÐ ÔÒº Í Ò ÒĐÒ ÓÒÒ ÑÙØØ Òº Lause. ËÙÖÚØ ÔĐÝØĐÐĐÓØ ÓÚØ ÚÓÑ Ó ½ ÓÒ Óй ½¼

105 Ñ ÙÒ Ü ¼ ¼ Ü Ü Ü Ü Ü Ö ½ ½ Ö Tod. ÃÓ ÓÒ ¹ ÒÙÐÖÒÒ ÝØĐÐĐÓ ØĐ Ö Ü Ü Ü ÙÖ Ü Ü ½ Ö ÓØÒ Ü Ü ½ Ö ½ Ö ÄÒÖÙÚÙ ÐÐ Ò Ü Üµ ÌÓ ÐØ Ó Ø Ü Ò Ü Ü Ü Ü ½ Ö ÎÓÒ Ó ÓØØ ØØĐ ½ ÓØ ÝÓº ÐÙ Ò ÒÓÐÐ ÚÓ¹ Ø Ò ÒÓ ÚÖÒ ÚÚ ØÙÑ ÖØÓÑ ÓÒ Ñ ÙÒ ¹ ÑÑÒ ØÐØÝ ÙÒØÓ ÙÙ ÐÙÙ ÓÒ µ Kuntoisuusluvun säätö. Ì ØÙ ØÖÓØÙ ÚÖØÒ ÚÓ ÓÐÐ ĐØÚĐĐ ØÙÓØØ ÑØÖ ÓÒ ÙÒØÓ ÙÙ ÐÙÙ ÓÒ ÒÒÐØ Ò¹ ÒØØÙº ÌĐĐÒ ÔĐĐ ØĐĐÒ ÙÖÚ Ø ½µ ÒÖÓÒ ØÙÒÒ ÑØÖ Ò ËÎ Ù Ú ¾µ ÑÙÙØØÒ ÒÙÐÖÖÚÓ ÙÓØÙ Ø ØÙÐÓ Ò ½ µ ÑÙÓØÙÐÐ ÑØÖ ÐÐ Ù ½ Ú ÓÒ ÐÙØØÙ ÓÒ µº ÆĐÑĐ Ø ÓÒ ÑÔÐÑÒØÓØÙ ÓÐÑÒ rancon myrancon ÓØ ÐĐÓÝØÝÚĐØ ÛÛÛ¹ ÚÙÐغ Kuntoisuusluvun vaikutus virheeseen. ÄÒÖ Ò ÝØĐÐĐÓÖݹ ÑĐÒ Ü Ñ Đ ÓÒ Ò Ò ÑØÖ ÒÙÑÖ ÖØ ¹ Ñ ÒØÝÚĐĐ ÚÖØØĐ ÚÓÒ ØÙØ ÙÖÚÐÐ Ð ÒÒÐй ÐÐ ÓÐÐ Ó ĐÝØĐÑÑ ÝÚĐ ÐÐĐ ØØØÝĐ ÙÒ¹ ØÓ ÙÙ ÐÙÚÙÒ ĐĐØĐÓĐÓÒº ÊØ Ò ÓÒ LUsolveº ÎÖÒ ÑØØÖÒ ½¼

106 ĐÝØĐÑÑ ØÓÐÐ Ø ÚÖØØĐ Ø º ÓÒ ØÖÙÓÑÑ ÐÒº Ý ØÑÒ ÓÒ¹ ÖØ ÙÒ ÓÒ ØÙÒÒØØÙº ÒÒÑÑ ÓÒ µò Ú ÔÖÖĐÑÑ ÙÚÒ ÚÖ ØĐº ËÙÖÚ ÙÚ ÓÒ ØØØÝ ÚÖ ÓÒ µò ÙÒØÓÒ ÐÓÐÓ¹ Ð º ÌĐÑĐ ÓÒ ØÓØÙØØØÙ ÓÐÑÒ myrgcon.cpp ÛÛÛ¹ ÚÙÐк cond(a) residual error e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e Error versus condition number/myrgcon.cpp Error cond(a) ÂÓØÓÔĐĐØĐÓ ÒĐ ÙÚÓ Ø ØÓØÒ ØØĐ ĐÝØØÝ Đ ÐÓÐÓ¹ ¹ Ð ØÓ ÚÖÒ ÙÒØÓ ÙÙ ÐÙÚÙÒ ÚĐÐÐÐĐ ÓÒ ÐÑÒ ÐÒÖÒÒ ÖÔÔÙÚÙÙ º Ä Đ ØÓØÒ ØØĐ Ö ÙÐ ÓÒ ÓÓ Ò Ñ ÙÙÖÙÙ ÐÙÓ Ú ÚÖ ØÙÐ ½¼ ½¼ ÖØ º ½¼

107 2.22. Sovellus PNS-ongelmiin. ØØØ Ô ÓÐÚÒ ÔÓÐÝÒÓÑÒ ÓÚØع ÑÒÒ ØÒ Ü Ý µ ½ Ñ Ñ Đ Ü Ü ½ Ñ Ô ÓØ ÝÐÑĐĐÖĐØØÝÝÒ ÐÒÖ Ò ÝغÖÝÑĐĐÒº ÇÐÓÓÒ ÓÚØØØÚ ÔÓÐݹ ÒÓÑ Û Üµ È Ô ¼ Û Ü Ô ØĐÐĐÓÖÝÑĐ ÓÒ Û Ü ½ µ Ý ½ º º Û Ü Ñ µ Ý Ñ ÃĐÝØØĐÑĐÐÐĐ ¹ÐÒ ¼¹ÒØ Ø Ò ÓÒØ ÖÖÓÒÑØÖ ÐÐ ÔĐØ Ü ½ Ô ¼ Ñ ½ ¼ Ô ÝØĐÐĐÓÖÝÑĐ ÚÓÒ ÖÓØØ ÑÙÓØÓÓÒ Û Ý Ò ÖØ Ù Û Ý ÐĐÓÝØĐĐÒ Ñº SVDsolveÐк ÈÆ˹ØØĐÚĐĐÒ ÐØØÝÚĐØ ÒÓÖÑÐÝØĐÐĐÓØ ÓÚØ Ë Ûµ Û ¼ Ë Ûµ È Ñ ½ Û Ü µ Ý µ ¾ ¼ Ô ËÒĐ ØÔÙ ØØĐ ÙÒØÓÐÐ Û Üµ ÓÒ ÑÙÓØÓ È Ô ¼ Û Üµ ÙØÒ ÔÓÐÝÒÓÑ ÓÚØÙ Ó Üµ Ü µ Ó ØØ ÖÚÓÒÒØ ÓÒ ÐÔÔÓ Ð ÒÓÖÑÐÝØĐÐĐÓØ ÑÙÓÓ ØÚØ ÐÒº ÝØĐÐĐÓÖÝÑĐÒ ÖØÓÑÐÐ Û ÃÚ Û Ý ÒØ ÒĐÒ ÖØ ÙÒº /* FILE: mypfit2.cpp begins. */ (...) Vec_DP polyfit(vec_dp &x, Vec_DP &y, int deg ) int ndata=x.size(); Vec_DP coef(deg+1); Mat_DP a(ndata,deg+1); if ((ndata<deg+1) (ndata!=y.size())) cout<<"argument error in polyfit\n" <<endl; abort(); for (int i =0;i<ndata;i++) for (int j=0;j<=deg;j++) a[i][j]=pow(x[i],(double)(deg-j)); SVDsolve(a,y,coef); cout<<"coefficient c= \n"<<coef<<endl; cout<< ½¼

108 "Format: c[0]x^p +c[1]x^p c[p] ; p= c.size()-1\n"; getchar(); return coef; int main() for (int poldeg=2;poldeg<7;poldeg++) int mdata=poldeg+9; Vec_DP x(mdata), y(mdata), coef(poldeg+1); GenData(x,y); coef=polyfit(x,y,poldeg); PlotPolyData(x,y,coef); /* FILE: mypfit2.cpp ends. */ Tulostuksesta: Coefficient c= Format: c[0]x^p +c[1]x^p c[p] ; p= c.size()-1 ¾¼ ½ ½¼ ¼ ¹ ¹½¼ ¹½ ¼ ½ ¾ Ö ÂÒ ½ ½¼¼½¾ ¾¼¼¾ ½¼

109 2.23. PNS-sovitus annetuihin funktioihin. ÐÐĐÓÐÚ mypfit2.cpp ÚÓÒ ÝÚÒ ÐÔÓ Ø ÑÙÙÒØ ÒÒ ØØĐ ÔÓÐÝÒÓÑÙÒØÓØ ÓÖ¹ ÚØÒ ÑÖ ØÖÓÒÓÑØÖ ÐÐ Ø ÑÙÐÐ ÓÔÚÐÐ ÙÒØÓÐк ËÙÖÚ Ø ÓÑÑ ÑØÒ ØĐÑĐ ØÔØÙÙº ÄĐØĐÓÓØÒ ÑÐÐĐ ÓÒ ÒÒØØÙ ÙÒØÓÓÙÓ ÑÖ Üµ ¼ Ô ¹ Ø Ü Ý µ ¼ Ñ Ñ Ô Ø ÑÑ ÈÆ˹ÑÐ Đ ÔÖØÒ ØÒ ÓÔÚ ÙÒØÓØ È Ô ¼ Û Üµ ÅÙÓÓ ØÑÑ ÙÑÑÒ Ë Ûµ Ñ Ý Û Ü µµ ¾ ¼ Ó ÐÙØÒ ÑÒÑÓ ÖØÓÑ Û ÚØÐÑÐк ÇÔØÑй ÒÒ Û Ò SVDsolveÒ ÚÙÐÐ ÙØÒ ÐÐĐ ÒĐØÒº ÌĐ Đ ØØĐÚĐ Đ ÙØÒ ØĐÐÐĐ ÙÖ ÐÐ Ù Ò ÑÙÙÐÐÓÒÒ ÓÒ ÓÒ¹ ÐÑÒ Ñ ØĐ Ò ÓÔÚ Øº ËÓÚÐÐÑÑ ÝÒØØØ Ò ØÒ ÑÒØÐÑĐĐ ÓÐÐ ØÖÓØØÒ ÙÖÚº ÃÒÒØĐÑÑ ÐÙ¹ ÚÙØ Ñ Ô ÚØÓÖØ Ü Û ÑÙÓÓ ØÑÑ ÝÒ ÙÖÚ Ø Ý È Ô ¼ Û Ü µ ¼ Ñ ÄÓÔÙ Ð ĐĐÑÑ ÚÐĐ ØÙÒÒ ÚÖ¹ ØØĐÝÝÒº ÆĐÒ ÑÙÓØØÙ Ø ÒÒØÒ ÐÓÖØÑÐÐ ÝĐÓØØ º ËÒĐ ØÔÙ ØØĐ Ð ĐØØÝ ÚÖ ÓÒ ÔÒØĐ ÓÒ ÓÓØØØÚ ØØĐ ÐÓÖØÑÒ ØÙÓØØÑ ÖÚÓ ÓÚØÙ ÔÖÑØÖÐÐ Û ÓÒ ÐĐÐÐĐ Ö¹ ÚÓ Û /* FILE: mylsqfit.cpp begins. */ /* This program generates some data and fits in the LSQ sense, a set of functions g_j, j=0,..,p, to this data. Data: x[i], y[i], i=0,...,n-1 (n>p) Model: f(x)=sum_j=0^pw[j] g_j(x[i]) System of n-equations f(x[i]) = y[i], i=0,...,n-1 is of the form A w= y, A[i][j]=g_j(x[i]), j=0,...,p and its LSQ solution is w= A^+ y where A^+ is the pseudoinverse (A^T A)^-1 A^T. SVDsolve gives w. */ (...Ks. mypfit2...) double g(int j, double x) ½¼

110 if (j==0) return 1.0; if (j==1) return log(1.0+x*x); if (j==2) return 1./(1+x*x); if (j==3) return x; void GenData(Vec_DP &x, Vec_DP &y ) int ndata=x.size(); for (int i =0;i<ndata;i++) x[i]= 1.0*i; y[i]= (1.0*g(0,x[i])+ 2.0*g(1,x[i]) -0.5*g(2,x[i]))*rdm(0.9,1.1) ; DP MyModel(Vec_DP c, DP x) /* MyModel returns c[0]*g(0,x) + c[1]*g(1,x) + c[2]*g(2,x) p= c.size()-1 */ int m=c.size(); if (m!=3) cout<<"argument arror in MyModel\n"; exit(1); DP s=0.0; for (int j=0;j<m;j++) s+= c[j]*g(j,x); return s; void PlotPolyData(Vec_DP &x, Vec_DP &y, Vec_DP &coef) (...Ks. mypfit2 ) for (int i=0;i<50;i++) yymodel[i]= MyModel(coef,xx[i]); MyPlot(x,y,xx,yymodel,x,y); Vec_DP lsqfit(vec_dp &x, Vec_DP &y, int nr_func ) int ndata=x.size(); Vec_DP coef(nr_func); Mat_DP a(ndata,nr_func); if ((ndata<nr_func) (ndata!=y.size())) cout<<"argument error in polyfit\n" <<endl; abort(); for (int i =0;i<ndata;i++) for (int j=0;j<nr_func;j++) a[i][j]=g(j,x[i]); ½¼

111 SVDsolve(a,y,coef); cout<<"coefficient c= \n"<<coef<<endl; cout<< "Format: c[0]x^p +c[1]x^p c[p] ; p= c.size()-1\n"; getchar(); return coef; int main() int mdata=12; Vec_DP x(mdata), y(mdata), coef(3); GenData(x,y); coef=lsqfit(x,y,3); PlotPolyData(x,y,coef); /* FILE: mylsqfit.cpp ends. */ ½¾ ½¼ ¾ ¼ ¹¾ ¹¾ ¼ ¾ ½¼ ½¾ Ö ÂÒ ¾ ½¼¾ ¾¼¼¾ Isotermit. ËĐĐÖØÓ ÐĐÑÔĐÓØÐÚÝĐÓÝØ ÑÙÓÓ ØÚØ ÐÙØ ÓÒ ÖØ ÑÖØĐĐÒ ĐÝÖÐÐĐº ÃĐÝÖĐ ÓÐÐ ÐĐÑÔĐÓØÐ ÓÒ ÚÓ ÓÒ ÒÑÐØĐĐÒ ÓØÖѺ ÄĐÑÔĐÓØÐÚÝĐÓÝÒ ÖÙÒ ÑÙÓ¹ Ó ØÙÙ Ý ØĐ Ø Ù ÑÑ Ø ÓØÖÑ ØĐº Á ÓØÖÑØ ÑÙÓÓ Ø¹ ØÒ ĐĐ ÑÒ ÑØØÙ ØÙÐÓ ØÒ ÔÖÙ ØÐк ÌÖ ØÑÑ ÒÝØ ØØĐÚĐĐ ÓÒ ØÖÙÓ ÓØÖÑØ ĐĐÚÒØÓÒ ÔÓÐغ ÌĐĐÒ ÐØØÝÒ ÐÙÑÑ ÒÒÙ Ø ÓØÖÑÒ ÚÙÐÐ ÐĐÑÔĐÓØÐÒ ÑÙÙØÑ ÑØØÙ Ô ØÒ ÙÐÓÔÙÓÐ Ô º ½½¼

112 ÌÑÑ Ò Ò ÑØÑØØ Ò ÑÐÐÒ ÐĐÑÔĐÓØÐÐк ÇÐØÑÑ ØØĐ ÐĐÑÔĐÓØÐ ÙÚ ØÓ Ò ØÒ ÔÓÐÝÒÓÑÙÒØÓ Ü Ýµ Û ¼ Ü ¾ Û ½ Ý ¾ Û ¾ ÜÝ Û Ü Û Ý Û Ó ÖÖÓÒÚØÓÖ Û ÐÙØÒ ØÑÓ ÑØØ٠غ ÇÒÐÑ ÓÒ ØĐ ÑĐÐÐÒ Ñ ÙÒ ÐÐĐ ØÐØÝ ÙÒØÓ ÓÚØÙ ÖØÝ Ø ÖÔÔÙÙ ÐÒÖ Ø ÛÒ ÓÑÔÓÒÒØ Ø ÓØ ÈÆ˹ÝØĐÐĐÓÒ ÓØ ÚÓÑÑ ÖØ Ø SVDsolveÐк ÅÐÐÒ ØÓØÙØÙ ÚÓÒ ÙÖÚÒ Ó ØØĐÚÒ ½µ ÖØÒ ÔÖØÓ ¾µ ÚÒØÓÔ ØÒ ÑÖØ ÑÒÒ ÖØØÒ µ ØÙØÑÙ Ô ØÒ ÑÖØ ÑÒÒ ÖØØÒ µ ÓØÖÑÒ ÔÖØÓ µ ØÙÐÓ ØÒ ÖÓØÙ ØÙØÑÙ ÔÙÒÒÐк ÄĐØĐÓÓØÒ ÓÐÚØ ĐĐÚÒÒÓØ City name xcrd ycrd Temp. Helsinki Kotka Joensuu Kajaani Oulu Kokkola Uusikaupunki Turku ÌÙÐÓ Ò ÓÐÚØ ÐĐÑÔĐÓØÐÒÒÙ ØÙ Ø City name xcrd ycrd Real. temp. Estim. temp. Jyvaskyla Mikkeli Lahti Pori Kuopio Vektorin w kertoimet: coef= ½½½

113 Pori Kokkola Oulu Uusikaupunki Lahti Turku Helsinki Kotka Kajaani Kuopio Joensuu Jyvaskyla Mikkeli ÃÓº ÓÐÑmytemp4.cpp ÔÙØÓ ØÓÒÒ ÐĐÓÝØÝÝ ÙÖ Ò ÛÛÛ¹ ÚÙÐغ ÀÙÓÑ ØØĐ ØĐÑĐ ÑÐÐ ØÙÓØØ ÑÐÓ ÝÚĐ ØÙÐÓ ÙØÒ ÒĐĐĐÒ ØÙÐÓ Ø٠غ ÃÙØÒÒ ÑÐÐ Ú ØÒ ÚÓÒ ØØĐĐ ÖØĐ ĐÐ ØØĐ ÐĐÑÔĐÓØÐÓÒ ÖÚÓØ ÚØÐÚØ ÖÓ¹ ØÐÙÐÐ ÚĐÐÐÐĐ ÑÙØØ ÑÐÐÒ ĐÝØØÝÐÐĐ ÔÓÐÝÒÓÑÙÒØÓÐÐ ÓÐ ØĐØĐ ÓÑÒ ÙÙØغ Komentoriviargumentit C-ohjelmassa. ÇÐÑÑ Ó ÄÙÚÙ ½ ÒĐÒØ ÑØÒ ¹ÓÐÑÒ ÝĐÓØØĐÓ ØÙÐÓ ØÙ ÚÓÒ ÙÙÒÒØ ØÓ ØÓ Ø ØÔØÙÚ º Ѻ myprog <myprog.inp >myprog.out ÓØØ ÝĐÓØØÒ Đ ØÓ ØÓ Ø myprog.inp ÖÓØØ ØÙÐÓ ØÒ¹ ØÓ ØÓÓÒ myprog.out. ÆÝØ ØØÐÑÑ ÓÙ ØÚÑÑÒ Ø¹ ½½¾

114 ÚÒ ÓÐÑÒ ØÓÑÒÒÒ ÓÑ Ò º ÓÑÒØÓÖÚÖÙÑÒع ØÒ ÚÙÐк ÆĐÒ ØÓÑØØ ÓÑÒØÓ myprog 3 4 a.dat ÚÓ ÓØ ÓÐÑÒ ÐÙÑÒ ÑØÖ Ò ØÓ ØÓ Ø a.dat Ø ÖÓØØÑÒ ÒÒ ÑØÖ Òº ÎÐÑ ØÐÙÒ ÓÑÒØÓÖÚÖÙ¹ ÑÒØØÒ ĐÝØĐÓÐÐ ÓÒ ÔĐĐÓÐÑÒ ÐÙ ÐÑ ØÚ ÖÙÑÒØØ Ù¹ ÖÚ Ø main(int argc, char *argv[ ]) ÖÙÑÒØØ ÚØ ÖÚÓ Ú Ø ÓÒ Òº ÇÐÑÓÓ ÚÓÒ ØĐ ÖÔÔÙÚ ØĐ ÑÐÐ ÐÐ ÑÓÒÐÐÓ ÖÙÑÒØÐÐ ÓÐÑ ÙØ ÙØÒº ÃÓÓÒ ÐÙÚÙÒ argc ÖÚÓ ÓÒ ÝØĐ ÙÙÖÑÔ ÙÒ ÓÑÒØÓÖÚÐÐĐ ÒÒØØÚÒ ÖÙÑÒØØÒ ÐÙÙÑĐĐÖĐ ÑÖ¹ ÓÒÓ argv[0] ĐÐØĐĐ ÓÐÑÒ ÒÑÒº Óº ÑÖ Đ argc = 4, argv[1] = "3", argv[2]= "4", argv[3] ="a.dat". ÂØÓ ØÙÐÑÑ Ù Ø ĐÝØØĐÑĐĐÒ ÓÑÒØÓÖÚÖÙÑÒØغ ÃØ ÓÑÑ ÒÝØ ÑÙÙØÑ ÚÐ Ú ÑÖĐº Tiedoston tulostus ruudulle. Ò ÑÑĐÒÒ ÓÚÐÐÙ ÓÑÒ¹ ØÓÖÚÖÙÑÒØ Ø ÓÒ ÙÖÚ ÓÐÑ Ó ÔÝÝØĐĐ ĐÝØØĐĐÐØĐ ËÁÁ ØÓ ØÓÒ ÒÑÒ ØÙÐÓ Ø ØØÒ ØÓ ØÓÒ ĐÐÐĐÓÒ ÙÚ¹ ÖÙÙÙÐк /* FILE: myshow4.c begins */ /* USES:... */ /* Displays an ascii file on the screen */ /* Unix version */ #include <string.h> #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv[]) ½½

115 char dest[20]="more ",name[20]; if(argc>2) printf("\nusage: myshow4 a.dat or myshow4 \n"); exit(1); if (argc==2) strcat(dest,argv[1]); system(dest); exit(1); system("ls -x more"); printf("enter the name of an ASCII file:\n"); scanf("%s",&name); printf("the file name you entered: %s\n",name); strcpy(dest,""); strcat(dest,"more "); strcat(dest,name); system(dest); return 0; /* FILE: myshow4.c end */ Pieni laskin. ÌÓÒÒ ÑÖÑÑ ÓÒ ÔÒ Ð ÒÓÐÑ myfeval.cpp ÓÒ ÚÙÐÐ ÚÓÒ ÐÔÓ Ø Ñº ÑÙÙÒØ ÙÖÓØ ÑÖÓ º ÌĐÑĐ ÓÐÑ ĐÝØØĐĐ ÔÙÒÒ ÓÐÑ dofeval.cpp ÓÒ ÑÝĐÓ ĐĐÒØĐĐ Ý ØÑÙØ ÙÐк /* FILE: myfeval.cpp begins */ /* g++ -Wall myfeval.cpp -o a -lm */ /* Function evaluator */ /* Usage:./myfeval "sin(0.4)" */ /* OR:./myfeval "real(pow(complex<double>(0,1.0), 0.5))" */ /* Decimal point is important. Wrong result: "6* " 6* = g++ -v gcc version egcs /Linux (egcs release) Effect of a decimal point: "6* " 6* = */ ½½

116 #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> #include <cmath> #include <complex> using namespace std; /* double myohj10f(void) double t; t=...; return t; */ /* Write a function of the above format */ void write_func(char *cmdlarg ) char *fname ="myfevalf.cpp"; char *line1 ="double myfevalf( void)", *line2 ="double t;", *line4 ="return t;"; FILE *fp; system("rm myfevalf.cpp"); if ((fp =fopen(fname,"w")) ==NULL) printf("\ncannot open file %s", fname); exit(1);; fprintf(fp, " %s\n %s\n t= %s ;\n %s\n", line1,line2,cmdlarg,line4 ); fclose(fp); int main(int argc, char *argv[]) char buff[256]=""; if ((argc!=2)) printf("\nusage:./myfeval \"sin(0.4)\" \n"); printf("or:./myfeval \"" "real(pow(complex<double>(0,1.0), 0.5))\"\n"); exit(1);; if (argc ==2) ½½

117 write_func(argv[1]); system("g++ dofeval.cpp -o dofeval -lm"); sprintf(buff,"%s %s %s %s", "./dofeval ", "\"", argv[1], "\""); system(buff); return 0; /* FILE: myfeval.cpp end */ /* FILE: dofeval.cpp end */ /* g++ dofeval.cpp -o dofeval -lm */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> #include <cmath> #include <complex> #include "myfevalf.cpp" int main( int argc, char *argv[]) double t=myfevalf(); printf("%s = %16.8lf \n",argv[1],t); return 0; /* FILE: dofeval.cpp ends */./myfeval "6*12.34 " 6*12.34 = Ohjelman kirjoittama funktio: double myfevalf( void) double t; t= 6*12.34 ; return t; ½½

118 2.28. Graafinen laskin mycal. ËÙÖÚ ÓÐÑ ÑÖ ÐÒØ ÐÐĐÓÐÚ º Ë Ó ÓØØ ÑØÒ ¹ÐÒ ÒÙÔÐÓØÒ ÝØ ¹ ØÓÑÒØ ÚÓÒ ÓÓÖÒÓ ØÒ ØØĐ ÒÙÔÐÓØ ØÓÑ Ö Ò Ð ÑÒ ØÚÓÒº ÌĐÑĐ ÑÒ ÑÓÒÑÙØ ÑÔ ÑÖ Ó Óع Ø ÑØÒ ÓÑÒØÓÖÚÐØĐ ÒÒØØÙ ¹ÐÒ ØÙÒØÑ Ø ÙÒØÓ Ø ØØÝ ¹ÐÒ ÝÒØ Ò ÑÙÒÒ ÙÒØÓ ÚÓÒ ÔÖØĐĐ ÒÙÔÐÓ¹ ØÒ ÚÙÐк ÇÐÑ ÖÒØÙÙ ÙÖÓÐÑÒ mycal.cpp ÔÙÓ¹ ÐÑÒ myta.cpp ÝØ ÔÐÒ ØÓÑ ÙÖÚ Ø 1. ÒÒØÒ ÓÑÒØÓ./mycal sin(x+cos(x)) +x*x º 2. mycal ÖÓØØ ÒÒØÙÒ ÐÙ Ò ØÓ ØÓÓÒ mytaf.cpp ¹ÙÒØÓ Ó ÓÒ myta.cppò ÒÐÙ¹ØÓ ØÓº ÑÖÑÑ ØÔÙ ÖÓØØØÚ ØÓ ØÓ ÓÒ ÙÖÚ double mytaf(double x) double t=0.0; t= sin(x+cos(x)) +x*x ; return t; 3. ÌĐÑĐÒ ĐÐÒ mycal Ý ØÑÙØ ÙÐÐ ĐĐÒØĐĐ ÓÐÑÒ myta.cpp Ó ÔÙÓÐ ØÒ ÖÓØØ ØÓ ØÓÓÒ ÙÒØÓÒ ÖÚÓØ ÒÙÔÐÓØÒ ÓÑÒØÓØÓ ØÓÒ ÐÐÒ Ý ØÑÙØ ÙÐÐ ĐÝÒÒ ØĐĐ ÒÙÔÐÓØÒ ÔÖØĐÑĐĐÒ Óº ØÓ ØÓ ÓÐÚÒ ØÒº 4. ÀÙÓÑ ÐÒÙ ÑÖØ ÒÒØÙÒ ÙÒØÓÐÙ Ò ÝÑÔĐÖÐÐĐº /* FILE: mycal.cpp begin */ // g++ mycal.cpp -o mycal -lm /* mycal writes a function and compiles myta.cpp for plotting the function */ /* USAGE:./mycal "sin(x) +NR::bessj0(x)" */ /* OR:./mycal "real(pow(complex<dp>(2.0*x,x),2.0))" */ /* USES: myta.cpp, gnuplot */ /* DELETES: mytaf.cpp and writes it again */ /* 1 Jan. 1999, 20 Jan */ ½½

119 #include <cstring> #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> #include <cmath> using namespace std; void wrtfunc(int dim, const char *fexpress, const char *funame, const char *filename) /* Example: wrtfunc(1,argv[1], "fnew123","fnew123.c"); wrtfunc(3,argv[2], "fnew321","fnew321.cpp"); */ FILE *fp; const char *fname =filename; const char *line2 =" double t=0.0;", *line4 ="return (double) t;"; const char *line6 ="double t;"; char buff[80], line1[80], line5[80]; strcpy(buff,""); strcat(buff,"rm -f "); strcat(buff,filename); system(buff); strcpy(buff,""); strcat(buff,"double "); strcat(buff," "); strcat(buff,funame); strcat(buff,"(double x[])"); strcpy(line1,""); strcpy(line1,buff); strcpy(line5,""); strcpy(line5, "double "); strcat(line5,funame); strcat(line5, "( double x)"); fp= fopen(fname, "w"); if (fp==null)printf("file error mycal.cpp"); exit(1); if (dim >1) fprintf(fp,"%s\n%s\n",line1, line2); ½½

120 fprintf(fp,"t= %s ;\n%s\n", fexpress,line4); else fprintf(fp,"%s\n%s\n",line5,line6); fprintf(fp,"t= %s ;\n%s\n", fexpress,line4); fclose(fp); int main(int argc, char *argv[]) if (argc == 1) printf("\nusage:./mycal \"sin(x)+nr::bessj0(x)\" \n"); exit(1);; if (argc >=2) wrtfunc(1,argv[1],"mytaf","mytaf.cpp"); system("g++ myta.cpp -L../lib/ -I../utils -o myta -lm -lnr"); system("./myta"); return 0; /* FILE: mycal.cpp end */ /* FILE: myta.cpp begin */ /* This is a slave program used by mycal.cpp */ /* USES: gnuplot */ /* DELETES: mytaf.c and writes it again */ /* Writes z.dat */ /* Tested for g */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include "nr.h" #include "matutl02.h" #include "mytaf.cpp" void tabula() ½½

121 extern double mytaf(double); double x, dx, x1, x2,y, tmp; int i; FILE *fp; const char *fname, *name="z.dat"; printf("enter x1: \n"); scanf("%lf", &x1); printf("enter x2: \n"); scanf("%lf", &x2); tmp=x1; if (x2 < x1) x1=x2; x2=tmp; printf("enter dx: \n"); scanf("%lf", &dx); if (dx < 0) dx =-dx; if ( dx > fabs(0.5*(x2-x1))) dx=(x2-x1)*0.05; fname=getfname(name); fp =fopen(fname,"w"); if (fp==null) printf("file error in myta"); exit(1); x=x1; do y=mytaf(x); fprintf(fp,"%12.6e %12.6e \n",x,y); x+=dx; while (x <x2); fprintf(fp,"%12.6e %12.6e \n",x2,mytaf(x2)); printf("values written in file %s \n",fname); fclose(fp); system("rm gnuplot.cmd"); name="gnuplot.cmd"; if ((fp =fopen(name,"w")) ==NULL) printf("\ncannot open file %s", name); exit(1);; fprintf(fp,"set grid\nset timestamp\n"); fprintf(fp,"plot \"%s\" with lines \npause -1\n",fname); fprintf(fp,"set terminal postscript\nset output \"myta.ps\"\nreplot\n"); fclose(fp); system("gnuplot gnuplot.cmd"); int main() tabula(); return 0; /* FILE: myta.cpp end */ ½¾¼

122 ÇÐÑ mycal.cpp ĐĐÒÒØĐĐÒ Đ ÝÐÐĐ Ó ÐÑÒ ÐÙ ÓÐÚ Ø ÓÑÑÒØ Øº ÀÙÓÑ ØØĐ mycal.cpp ĐĐÒØĐĐ Ý Øѹ ÙØ ÙÐÐ ÓÐÑÒ myta.cppº D graafinen laskin. ËÙÖÚ ÑÖ Đ ØÑÑ ÔÒÒÒ¹ ÔÖØÓÓÒ ÓÚÐØÙÚÒ ÑÙÙÒÒÐÑÒ mycal2d.cpp ÓÐÑ Ø mycal.cppº ÃĐĐÒÒĐÓ g++ mycal2d.cpp -o mycalc2d -lm º ÃÓÑÒØÓ./mycal2d exp(-x*x-y*y) ÓÐÑÒº /* FILE: mycal2d.cpp begin */ /* g++ mycal2d.cpp -o mycal2d -lm */ /* Example:./mycalc2d "sin(x*y) +NR::gammln(x*y)" if no blank spaces, " " may be omitted */ /*./mycal2d "real(nr::hypgeo(complex<double>(0.5,0), complex<double>(0.5,0), complex<double>(1.2,0), complex<double>(x,y)))" */ /* USES: mytas.cpp, gnuplot */ /* DELETES: mytasf.cpp and writes it again */ /* Tested only for g */ /* gcc: 1-Jan g++: 1-Jan-2002 */ #include <string.h> #include <stdio.h> #include <stdlib.h> #include <math.h> void write_func(char *cmdlarg) const char *fname = "mytasf.cpp"; const char *line1 = "double mytasf(double x,double y)"; const char *line2 = " double t=0.0;"; const char *line4 = "return t;"; FILE *fp; system("rm -f mytasf.cpp"); if ((fp = fopen(fname, "w")) == NULL) printf("\ncannot open file %s", fname); ½¾½

123 exit(1); ; fprintf(fp, "%s\n%s\n", line1, line2); fprintf(fp, "t= %s ;\n", cmdlarg); fprintf(fp, "%s\n", line4); fclose(fp); int main(int argc, char *argv[]) if (argc == 1) printf("\nusage:./mycal2d \"sin(x*y)+nr::gammln(x*y)\" \n"); exit(1); ; if (argc >= 2) write_func(argv[1]); system("g++ mytas.cpp -L../lib -I../utils -o mytas -lm -lnr"); system("./mytas"); return 0; /* FILE: mycal2d.cpp end */ /* FILE: mytas.cpp begin */ /* USES: gnuplot */ /* DELETES: mytasf.cpp and writes it again */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include "nr.h" extern double mytasf(double, double); #include "mytasf.cpp" ½¾¾

124 void tabula() extern double mytasf(double, double); double x, y, fxy, dx, dy, x1, x2, y1, y2, tmp; int i; FILE *fp; const char *fname, *name = "mytas.dat"; printf("enter x-interval (x1 x2):\n"); scanf("%lf%lf", &x1, &x2); printf("enter dx:\n"); scanf("%lf", &dx); printf("enter y-interval (y1 y2):\n"); scanf("%lf%lf", &y1, &y2); printf("enter dy: \n"); scanf("%lf", &dy); /* Checks begin */ tmp = x1; if (x2 < x1) x1 = x2; x2 = tmp; tmp = y1; if (y2 < y1) y1 = y2; y2 = tmp; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; if (dx > fabs(0.5 * (x2 - x1))) dx = (x2 - x1) * 0.05; if (dy > fabs(0.5 * (y2 - y1))) dx = (y2 - y1) * 0.05; /* Checks end */ fname = name; fp = fopen(fname, "w"); if (fp==null) printf("file error mytas.cpp\n"); exit(1); x = x1; y = y1; do ½¾

125 do fxy = mytasf(x, y); fprintf(fp, "%12.6e %12.6e %12.6e\n", x, y, fxy); x += dx; while (x < x2 + 1e-10); x = x1; fprintf(fp, "\n"); y += dy; while (y < y2 + 1e-10); printf("values written in file %s \n", fname); fclose(fp); system("rm -f gnuplot.cmd"); name = "gnuplot.cmd"; fp = fopen(name, "w"); if (fp==null) printf("file error mytas.cpp\n"); exit(1); fprintf(fp, "set contour\nset hidden3d\nset parametric\n"); fprintf(fp, "splot \"%s\" with lines\npause -1\n", fname); fclose(fp); int main(void) tabula(); system("gnuplot gnuplot.cmd"); return 0; /* FILE: mytas.cpp end */ ½¾

126 "a1.dat" ½¾

127 3 INTERPOLOINTI JA EKSTRAPOLOINTI ÅØØÙ Ò ØÓÓÒ ÔÖÙ ØÙÚØ ÖÚÓÒØØØĐÚĐØ ÓØÚØ ØÚÐÐ ¹ Ø ÒØÖÔÓÐÓÒع ØÖÔÓÐÓÒØÝ ÝÑÝ Òº ÆĐÒ Ý ÝÑÝ Ò ÓÙØÒ ÖÐ ØÒÒ ÐÙÓÒÒÓÒØØÒ ØÐ ØÓØØÒ ÓÒ¹ ÐÑ º Ä ÓÚÐÐÙ ÐÙ ÓÒ ÑÝĐÓ ØÓÐÐÒÒ ÑÙÓØÓÐÙ ØØÓÓ¹ ÒÖ ÓÒ ØØ ÓÚØ ÒØÒØ ÔÓÒØØ ÐÒ ÚÓÑÐÐ ØÝ ÐÐ ÚÑ ÚÙÓ Òº ÌÝÐÓÖÒ ÚÒ ÒÓÐÐ ØĐÑÑ ØØĐ ÔÓÐÝÒÓÑÐÐ ÚÓÒ ÔÔÖÓ ÑÓ ÙÒØÓØ Ý Đ Ô Ø Đº ÆĐÒ ÓÒ ÐÙÓÒÒÓÐÐ Ø ÐĐØĐ ÐÐÐ ÔÓÐÝÒÓÑ Ø ĐÝØØĐĐ ÒØĐ ÙÒØÓÒ ÔÔÖÓ ÑÓÒØÒ ØÖ ØÐØÚÐÐ ÚĐÐÐÐĐº ÅÙØ Ù Ò Ô¹ ÖÑÔ ÑÓÐÐ ÙÙ ÓÚØ ØÖÓÒÓÑØÖ Ø ÔÔÖÓ ÑØÓØ Ö¹ ØÓÒÐÙÒØÓØ Ø ÔÐÒØ ÔÐÔÓÐÝÒÓÑغ Perustehtävä. ÇÐÓÓÒ ØÙÒØÑØÓÒ ÙÒØÓ ÓÒ ÖÚÓØ Ý ½ Ý Æ ØÙÒÒØÒ ÚÒ Ô Ø Đ Ü ½ Ü ¾ Ü Æ º Ø ØØĐÚĐ ÖÚÓ ÜµÐÐ ÙÒ Ü ÒÒØØÙº ÌØĐÚĐ ÓÒ ÒÑÐØĐĐÒ ÒØÖÔÓÐÓÒØ Ó Ü ½ Ü Ü Æ ÑÙÙØÒ ¹ ØÖÔÓÐÓÒغ ÀÝÚĐ ØÝ Ø ÓÒ ØÓ ËØÓÖ¹ÙÐÖ Ë º Ratkaisuidea. ÇÐØØÒ ØØĐ ÓÒ ÝÚÒ ÔÔÖÓ ÑÓØÚ ØÙÒ¹ ÒØØÙ ØÝÝÔÔĐ ÓÐÚÐÐ ÙÒØÓÐÐ Ó ÓÒ Æ ØÙÒØÑØÓÒØ ÔÖ¹ ÑØÖ ½ Æ º Í Ò ÖÔÔÙÙ Ø ÐÒÖ Øµº ËÒ ÆÒ ØÙÒØÑØØÓÑÒ ÝØĐÐĐÓÖÝÑĐ Ó Æ ÝØĐÐĐÓĐ Ó Ø ØÙÒØÑØØÓ¹ ÑØ ÐÙØÒ ÖØ Øº ÁÒØÖÔÓÐÓÒÒ ÒØÝÚĐ ÙÒØÓØÝÝÔÔĐ ¹ÔÓÐÝÒÓÑ ¾ Ü ¾ ½ Ü ¼ ¹ÖØÓÒÐÙÒØÓ ½Ü ¼ ½Ü ¼ ¹ ÔÐÒ Ð ÔÐÔÓÐÝÒÓÑØ º ÙÐÐÒ ÚĐÐÐÐĐ Ü Ü ½ ÒØÖÔÓ¹ ÐÓÒØÙÒØÓ ÓÒ ÔÓÐÝÒÓÑÙÒØÓÒ ÖÓØØÙÑ ØĐÐÐ ÚĐÐÐÐ ÔÓÐݹ ÒÓÑÒ Ø ÔÝ ÝÝ ÑÒ ÖÖÝØØĐ Đ ÚĐÐ ØĐ ØÓ Ò ÑÙØØ Ö¹ ØÓÑØ ÚÓÚØ ÑÙÙØØÙº ÃÒ ÔÓÐÝÒÓÑÒ ÐØÓ Ô Ø Đ Ü Ñ¹ ½¾

128 ÓÐÐ Ø ØÓ ÖÚØÒ ØÙÚÙÙÐÐ ¹ ÔÓÒÒØØÙÒØÓÒ ÙÑÑ ¾ Ü ½ ¾Ü ¼ ÈÖÙ ØØĐÚĐÒ ÖØ Ù ÓÒ ÔÖØØ ÖØ ÙÚع Ø ½µ ËÓÚØØÒ ÒØÖÔÓÐÓÒØÙÒØÓ ÒÒØØÙÒ ØÔ Ø Òº ¾µ ÅĐĐÖĐØĐĐÒ ÙÒØÓÒ ÖÚÓ ÒÒØÙ Ô Ø Đ Ü ÎØÚÙÙ ÐÙÓ ÓÒ Ç Æ µ Æ Æ ÑØÖ Ò ĐĐÒØĐÓµº ÃĐÝØĐÒÒĐÓ Đ ØÓ Ò µ ÎÐØÒ ÒÔÙÖÔ Ø Ü Ý µ ÀÙÓÑÓÒ ÑÙÒ Ô ØÒ ÚÙØÙ Ð ÙÚÓÐк ÎØÚÙÙ ÐÙÓ Ç Æ ¾ µ ØÓÑÔ ÙÒ ÝÐÐĐº Rungen ilmiö. ÈÓÐÝÒÓѹÒØÖÔÓÐÓÒÒ ØÔ ØÒ Ð ĐĐÑÒÒ ÑÐÐ ÔÓÐÝÒÓÑÒ ØÒ ÚØØÑÒÒ ÚĐÐØØĐÑĐØØĐ Ð ĐĐ ØÖ¹ ÙÙØغ ÆÊ ÙÓ ØØÐ ¹ Ô ØÒ ĐÝØØĐÓĐ ÔÓÐÝÒÓѹÒØÖÔÓÐÓÒÒ º ÇÐÓÓØ Ü ½ Ü ¾ Ü Æ ÚĐÐÒ Á Ø ÚĐÐÒÒ Ó Üµ ½ ½ Ü ¾ µ Ô Æ ÖÚÓÒ Ü Ü µµ ÐØØÝÚĐ ÒØÖÔÓÐÓÒع ÔÓÐÝÒÓѺ ËÐÐÓÒ ÚÓÒ ØÓ Ø ØØĐ ÔĐØ ÐÑ ÑÜÔ Æ Üµ ܵ ½ ƽ ܾÁ ÌĐÐÐ Ø ĐÚ ØĐ ÝÐÐĐØÝ ØĐ ÔĐĐ ØĐĐÒ ÖÓÓÒ ĐÝØØĐÑĐÐÐĐ Ôй ÒĐº Ѻ ÝÐÐĐØØĐÚĐ ÐÑĐÓ ÓÒ ÔÖĐ Ò ÊÙÒ³Ò ØĐÓ ØĐ»½¼½µ º Ѻ ÔÔÖ ÓÒ ÑÖº ÅغÅÓÒØÐÝ ½ ¾¹ ½µ ÖÓÖݹ ÓÙÒ º ÖÐÐ ÙÙ ÐÙØØÐÓµº ÇÐÑ myrunge.cpp º ÛÛÛ¹ ÚÙ ÑÓ ÐÑĐÓØĐº ½¾

129 Ü ½ Ý ½ È ½ È ½¾ ½º ½ ¼º ¼ ¹¼º ¹½ ¹½º ¹ ¹ ¹¾ ¼ ¾ ÅÓÒ ¼ ¼¼ ¾ ¾¼¼¾ 3.1. Polynomi-interpolointi ja ekstrapolointi. ÄÖÒÒ Ú ÒØ Ô ØÒ Ü Ý µ ½ Æ Ü Ü ½ ÙØØ ÙÐÚÒ ÔÓÐÝÒÓÑÒ ÑÙÓÓ ½µ È Üµ Æ Æ ½ ½ Ü Ü µ Ü Ü µ Ý ÆÚÐÐ³Ò ØÙÐÙ È ÜµÒ Ð Ñ ÐÑÒ Ú ½µ Ü ¾ Ý ¾ È ¾ È ½¾ È ¾ È ½¾ Ü Ý È È ¾ Ü Ý È È ÓÒ Ô ØÒ Ü Ý µ Ü Ý µ ÙØØ ĐÝÚĐÒ ÐÒÖÙÒØÓÒ Ö¹ ÚÓ Ü Đº È ½¾ ÒØ Ô Øº Ü Ý µ ½ ¾ ÙØØ ÙÐÚÒ ØÓ Ò ØÒ ÔÓÐÝÒÓÑÒ ÖÚÓÒ Ü Đ Òº Óº ÚÓ ÐÙ Ò È ÚĐÐÐÐĐ ÚÐÐØ Ò º ÆÚÐÐ³Ò ¹ ÚÒ ÐÑ Ñ ÖÙÖ ÚÒÒ ÝØÝ Ó ÒØ ÒØÖÔÓÐØÓÔÓÐݹ È ½¾

130 ÒÓÑÒ ÖÚÓÒ Ý Đ Ô Ø Đ Ü È ½µ ѵ Ü Ü ÑµÈ ½µ Ñ ½µ Ü ÜµÈ ½µ ¾µ ѵ Ü Ü Ñ ÃÚ ØÓÐÐ ÒØ ØÝØĐÖÔÓÐÝÒÓÑÒ ÖÚÓÒ Ü Đ ÙÖÚ Ø Ý ØĐº Perustelu: ½µ Ë ÓÒ ØØØ ÓÖÑÔ ÙÒ È ½µ Ñ ½µ ¾µ È ½µ Ñ ½µ Ü µ Ý ½ Ñ ½ È ½µ ѵ Ü µ Ý ½ Ñ µ ÆÚÐÐ³Ò Ú È Ü µ Ý ÙÒ ½ Ñ ÐÓÖØÑ NR::polint º½¼º ÁÒØÖÔÓÐÓÒÒÒ ÖĐ ÓÚÐÐÙ ÓÒ ÒÙÑÖÒÒ ÖÚÓÒغ ÁÒØÖÔÓÐÓÒÒÒ ÝØÝ Đ ÔÙÙØÒ Ó Ù ĐĐÒØ ÒØÖÔÓÐÓÒÒ Øº ÌĐÐÐĐ ØÖÓØØÒ ÐÒ ÚØÓ Ü Ý µ Ý Ü µ ËÒ ÓÚй ÐÙ Ò ÓÒ ÙÒØÓÒ ¼¹ÓÒ Ø Ñ Ò ÚÖغ ÆÊÒ ÄÙÙ º Esim. ÐÐÓÐÚ ÓÐÑ ØÙÓØØ ØØØ Æ ÓÐÚÒ ÔÓÐÝÒÓÑÒ Ö¹ ÚÓ Æ ½ Ô Ø Đ ÔÓÐÝÒÓÑÒ ÖØÓÑØ ÓÚØ ØÙÒÒØØÙµº ÐÓ¹ ÖØÑÒ NR::polint NR::polcoe ÚÙÐÐ ÔÝÖÑÑ ÐĐÓÝØĐÑĐĐÒ Óº ÖØÓÑغ // FILE: mypolin5.cpp begins /* We have the values of a polynomial of degree n with known coefficients AGL at n+1 points x_i, y_i, i=0,...,n which we use as input data for polynomial interpolation with NR::polint. We also use NR::polcoe to see whether we can recover the original coefficients from this data. */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> ½¾

131 #include <cmath> #include "nr.h" #include "matutl02.h" using namespace std; double xmax=2.0; DP myf(vec_dp AGL,DP x) int n=agl.size(); double s=agl[n-1]; for (int j=1;j<n;j++) s=s*x+agl[n-j-1]; // Horner s rule return s; void Gen_XYval(Vec_DP &x, Vec_DP &y,vec_dp AGL) int p=agl.size(); for (int i=0;i<p;i++) x[i]=((dp)i)*xmax/(1.0*(dp)p); y[i]=myf(agl,x[i]); int main() DP dy,f,x,y; for (int n=2;n<=7;n++) Vec_DP xa(n+1), ya(n+1), coef(n+1), AGL(n+1); for (int i=0;i<n+1;i++) AGL[i]=rdm(0.5,3.0); cout<<"\npolyn. interpolation using "<<n+1<<" base points "; cout<<"on (0, xmax):\n"; Gen_XYval(xa,ya,AGL); cout<<endl<<setw(9)<<"x"<<setw(14)<<"f(x)"<<setw(17); cout<<"interpolated"<<setw(20)<<"error"<<endl; for (int i=0;i<=2*n;i++) x=((dp)i)*xmax/(2.0*(dp)n); f=myf(agl,x); NR::polint(xa,ya,x,y,dy); cout<<endl<<setw(9)<<x<<setw(14)<<f<<setw(17); cout<<y<<setw(20)<<f-y<<endl; NR::polcoe(xa,ya,coef); ½ ¼

132 cout<<"coefficients c_1 found:\n"; cout<<coef ; cout<<"coefficients c_2 of the data:\n"; cout<<agl; for (int i=0;i<coef.size();i++) coef[i]-=agl[i]; cout<<"norm(c_1-c_2)= "<<vnormp(coef,2.0)<<endl; // getchar(); return 0; // FILE: mypolin5.cpp ends ÇÐÑÒ ØÙÐÓ ØÙ Ø Polyn. interpolation using 3 base points on (0, xmax): x f(x) interpolated error e e e-15 Coefficients c_1 found: Coefficients c_2 of the data: norm(c_1-c_2)= e ÂÓØÓÔĐĐØĐÓ ÒĐ ÓÐÑÒ ØÙÐÓ Ø Ø ÓÒ ØØĐ ÔÓÐÝÒÓÑÒ ÓØ ÖØÓÑØ ÐĐÓÝØÝÚĐØ ÑØ ÙÒ myf еº 3.2. Interpolointi ja ekstrapolointi rationaalifunktioilla. ÊØÓÒÐÙÒ¹ ØÓ Ê ½µ ѵ ÓÒ ÑÙÓØÓ Ñ ½ ½º Ê ½µ ѵ È Üµ É Ô ¼ Ô ½ Ü Ô Ü Üµ Õ ¼ Õ ½ Ü Õ Ü ½ ½

133 ÊØÓÒйÒØÖÔÓÐÓÒØ ÓÚÐØÙÙ ÑÝĐÓ ØÐÒØ Ò ÓÐÐÓÒ ÔÓÐݹ ÒÓѹÒØÖÔÓÐÓÒØ ĐÝ ÒÑØØĐĐÒ ÒÓÐÐÓØ ÊÒ ½¹Óصº ÐÓÖØÑ NR::ratint ĐÝØØĐĐ ÝÚĐ ÆÚÐÐ³Ò ÚÒ ØÔ Ø ÔÐÙØÙ Úº 3.3. Kuutiosplini-interpolointi. ÇÐÓÓÒ Ü ½ Ü ¾ Ü Æ Ú ¹ ØÚØ ÙÒØÓÒ ÖÚÓØ Ý ½ Ý Æ º ÀÐÙØÒ ÔÔÖÓ ÑÓ ÙÒØÓØ ÚĐÐÐÐĐ Ü ½ Ü Æ ĐÝØØĐÒ ÔÔÖÓ ÑÒØØÒ ÙÒØÓØ ÓÐÐ µ Ü Ü ½ ÓÒ ÙÙØÓÔÓÐÝÒÓÑ ÖØÓÑØ ØÚÐÐ Ø ÖÔÔÙ¹ ÚØ Øе µ ÐÑ ÜÜ Æ ½ ¼¼ ܵ ÐÑ ÜÜ ¼¼ ܵ ÐØÓ Ô Ø Đ Ü ¾ µ ÃÙØÒ µ ÑÙØØ ¼ Ðк ØĐÐĐÓØ µ ÓØÚØ Æ ¾Ò ÝØĐÐĐÓĐÓÒ ÆÐÐ ØÙÒØÑØØÓÑÐÐ ¼¼ Ü µ ½ ƺ ÂÓØØ ØÙÒØÑØØÓÑØ ÑĐĐÖĐÝØÝ ÚĐØ ½¹Đ Øغ ÓÒ ØØØÚ Ð ĐÓØ ÔĐĐØÔ Ø Đ Ü ½ Ü Æ º ÌĐÐÐĐÓÒ ÓÒ ÑÓÐÐ ÙÙØØ µ غ ¼¼ Ü ½ µ ¼ Ø ¼¼ Ü Æ µ ¼ Ø ÑÓÐÑÑØ ¼ Ò º ÐÙÓÒÒÓÐÐÒÒ ÔÐÒµ µ غ ¼ Ü ½ µ Ø ¼ Ü Æ µ Ø ÑÓÐÑÑØ ÐÙØÙÒ ÙÙÖÙ ÌĐÐÐ Ø ÙÒØÓØ ÙØ ÙØÒ ÙÙØÓ ÔÐÒ º Ö Ø ÔÐÒ¹ÒØÖÔÓÐÓÒÒÒ ÚÙØÙ Ø ÚÓÒ ÚÒÒÓÐÐ ¹ Ø Ó ÐÐ ÙÚÐÐ Ó ÐØÓØ ĐÝÖĐÐÐĐ ÓÐÚØ Ô ØØ ÙÚ¹ ÚØ ÐÙÔÖĐ ØĐ Øº ËÔÐÒ¹ÒØÖÔÓÐÓÒØ ØÙÓØØ Ô ØÒ ÙØØ ÙÐÚÒ ÐĐÒ ĐÝÖĐÒº ½ ¾

134 ÐÓÖØÑÒ NR::spline ØÓÑÒØ input Ü ½ Ü ¾ Ü Æ Ý ½ Ý Æ Ð xa, ya Ð Đ ¼ Ò ÖÚÓØ Ô Øº Ü ½ Ü Æ yp1, ypn ØØÑÐÐ ÖÚØØÓÒ ÖÚÓØ yp1, ypn ÐÙÚÙ ½ ¼ Ò ÐÙÓÒÒÓÐÐÒÒ ÔÐÒº output ¼¼ Ò ÖÚÓØ Ô Øº Ü ½ Ü Æ y2a ÐÓÖØÑÒ NR::splint ØÓÑÒØ input Ü Ü Ý Ý ¼¼ Ð x, xa, ya, y2a output ÔÐÒ¹ÔÔÖÓ ÑØÓÒ ÖÚÓ Ô Øº Ü Reunaehto 1.derivaatan avulla. ËÙÖÚ ÓÐÑ Ó ÓØØ ØØĐ ÒĐ ÒÒØÙØ ÓØ Ò ÑÑĐ ÐÐ ÖÚØÐÐ Óº ÚĐÐÒ ÔĐĐØÔ Ø Đ ØÓØÙØÙÚØ ÚÖغ ÙÚÓº /* FILE: myspbr2.cpp */ /* This program carries out spline interpolation to data. If the parameter BRYCOND ==1 the difference quotient of the data at the end points gives bry conditions for the derivative otherwise constant values specified in SplineWithBryVal are used. ½

135 */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #define PRINT 1 #include "nr.h" #include "matutl02.h" #include "plot.h" double pwlin(vec_dp &dat, double x) double x1=dat[1],x2=dat[2],y1=dat[3], y2=dat[4], c1=dat[5],c2=dat[6], leikpis; if (dat[1] >dat[2]-1.0e-3) x1=dat[2]; x2=dat[1]+1e-3; if (fabs(c1-c2) <1.0e-3) if (x <0.5*(x1+x2)) return y1+c1*(x-x1); if (x >0.5*(x1+x2)) return y2+c2*(x-x2); else leikpis =(y1-y2+c2*x2-c1*x1)/(c2-c1); if (x <leikpis) return y1+c1*(x-x1); if (x >leikpis) return y2+c2*(x-x2); /* pwlin has slopes given by boundary */ /* values of the derivative */ return 1.0; void SplineWithBryVal(Mat_DP a,vec_dp &xa, Vec_DP &ya,vec_dp &y2a,vec_dp &dat, int brycond ) int m=a.nrows(); for (int j =0;j<a.nrows();j++) xa[j]=a[j][0]; ya[j]=a[j][1]; double yp1, ypn; /* Set derivatives at end points */ if (brycond == 0) yp1=0.5; ypn=-1.0; ½

136 else yp1= (ya[2-1]-ya[1-1])/(xa[2-1]-xa[1-1]); ypn= (ya[m-1]-ya[m-2])/(xa[m-1]-xa[m-2]); dat[1]=xa[1-1]; dat[2]=xa[m-1]; dat[3]=ya[1-1]; dat[4]=ya[m-1]; dat[5]=yp1; dat[6]=ypn; /* dat[0] not used! */ NR::spline(xa,ya,yp1,ypn,y2a); void PlotDataSplineBryVal(Vec_DP &xa, Vec_DP &ya, Vec_DP &y2a,vec_dp &dat, char *mydata) const char *fname ="z1.dat", *fnameb ="z2.dat"; fnameb =getfname(fnameb); fname =getfname(fname); FILE *fp, *fpb; fp =fopen(fname,"w"); fpb =fopen(fnameb,"w"); if ((fp==null) (fpb==null)) cout<<"file error in PlotDataSplineBryVal"<<endl; abort(); int N=xa.size(); if (N<40) N=40; double x,y; for (int j=0;j<=n-1;j++) x=xa[1-1]+(xa[xa.size()-1]-xa[1-1])*(j)/(n-1.0); NR::splint(xa,ya,y2a,x, y); fprintf(fp," %12.5lf %12.6lf\n",x,y); y=pwlin(dat,x); fprintf(fpb," %12.5lf %12.6lf\n",x,y); fclose(fp); fclose(fpb); plot(fname,"r-3",fnameb,"b-2",mydata,"ks4",null); int main(int argc, char *argv[]) int brycond; char *fname=argv[1]; if (argc!=2) printf("usage:./myspbr fname1.dat \n"); exit(1); Mat_DP a(1,1); a=getmat(fname); ½

137 showmat2(a," %10.4lf"); int m=a.nrows(); Vec_DP xa(m),ya(m), y2a(m), dat(7); for (int j=0;j<2;j++) brycond=j; SplineWithBryVal(a,xa,ya,y2a,dat,brycond); PlotDataSplineBryVal(xa,ya,y2a,dat,fname); /* FILE: myspbr2.cpp */ /* Tested with: a.dat: */ ¾º ¾ ½º ½ ¼º ¼ ¹¼º ¹½ ¹½º ¼º ½ ½º ¾ ¾º º º º ÅÓÒ ¼ ¼¼½ ¾¼¼¾ Ý ÐÒÒ ØÙÐÒØ È ØÒ Ü Ý µ ÙØØ ØØÙÒ Ñ¹ ÑÓ Ò ÙÚÒ ÑÙÓØÓ ÓÒ ÔÐÒ ÙÚÒ ÒÖ Ê Ü Ò Ü¼ ¼¼ µ ÔÝÖ ÑÒÑÒ Đ Óº ÖÓعÓÒµº // FILE: mysplint.cpp begin ½

138 #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include <cmath> #define PRINT 1 #include "nr.h" #include "matutl02.h" #include "gnuplt1.h" using namespace std; #define N 20 int n_global; DP yp1, ypn; Vec_DP xa(n), ya(n), y2a(n); DP a[n+1], b[n+1]; int M; DP myfunc(dp x) // myfunc gives the values of the sine sums DP s=0.0; int j; for (j=1;j<=m; j++) s-=a[j]*cos(b[j]*x)/b[j]; return s; DP dmyfunc(dp x) // dmyfunc2 gives the derivative function of myfunc DP s=0.0; int j; for (j=1;j<=m; j++) s+=a[j]*sin(b[j]*x); return s; ½

139 DP fsint(dp x) DP y; NR::splint(xa,ya, y2a, x, y); return y; DP deviat(dp x) DP y; NR::splint(xa,ya, y2a, x, y); return y-myfunc(x); int main() int i; DP x,y; M=7; // Generate random coefficients init_srand(); for (i=1;i<=m;i++) // rdm is from matutl a[i]= rdm(0.0,3.0); b[i]=rdm(0.3,6.0); // Generate array for interpolation for (i=1;i<=20;i++) xa[i-1]=i*4.0/n; ya[i-1]=myfunc(xa[i-1]); // calculate 2nd derivative with spline yp1=dmyfunc(xa[0]); ypn=dmyfunc(xa[n-1]); NR::spline(xa,ya,yp1,ypn,y2a); // test result cout<<setw(23)<<"spline"<<setw(17)<<"actual"; cout<<setw(17)<<"error"<<endl; cout<<setw(11)<<"angle"<<setw(15)<<"value"; cout<<setw(17)<<"value"<<endl; for (i=0;i<=15;i++) x=4.0*i/15; NR::splint(xa,ya, y2a, x, y); cout.precision(2); cout<<setw(10)<<x; ½

140 cout.precision(6); cout<<setw(17)<<myfunc(x)<<setw(17); cout<<y<<setw(17)<<y-myfunc(x)<<endl; gnuplt1(myfunc,"myfunc(x)",0, NULL); gnuplt1(deviat,"deviat(x)",0, NULL); return 0; // FILE: mysplint.cpp ends ¾ ÙÒ Üµ ½ ¼ ¹½ ¹¾ ¹ ¹ ¼ ¼º ½ ½º ¾ ¾º º ÐÐĐ ÓÒ ÙÒØÓÒ myfunc ÙÚº ÐÐ Ó ÓÐÑÒ ØÙÐÓ ØÙ ¹ Ø Đ ÚÐĐ ÚÖÙÒØÓÒ deviat ÙÚº spline actual error angle value value ½

141 ¼º¼¼ ¼º¼¼ ÚØ Üµ ¼º¼¼ ¼º¼¼¾ ¼º¼¼½ ¼ ¹¼º¼¼½ ¹¼º¼¼¾ ¹¼º¼¼ ¹¼º¼¼ ½ ½º ¾ ¾º º 3.4. Järjestetyn vektorin läpikäynti. ÇÐØØÒ Ü ½ Ü ¾ Ü Æ Ü ¾ Ê ØØÒ Ü ¼ ½ Ü Æ ½ ½ Tehtävä: Ø ºº Ü Ü Ü ½ ËÐÐÓÒ ¼ Æ Ó ¼ ÒÒ Ü Ü ½ Ó Æ ÒÒ Ü Ü Æ º ÐÓÖØÑ NR::locate º½½ ØÓØÙØØ ØĐÑĐÒº ÐÓÖØÑ NR::hunt ØÓÑ ÙØÒ NR::locate ÑÙØØ ÚÓÒ ÒØ ÐÙÖÚÙ Ò ÐÐ º 3.5. Interpolointipolynomin kertoimet. ÁÒØÖÔÓÐÓÒÒ ÝÐÒ Đ ØÖÚØ ÒØÖÔÓÐÓÒØÔÓÐÝÒÓÑÒ ÖØÓÑ ÐÙØÒ ÚÒ Ð Òغ ÔÓÐÒ ÖÚÓ ÒÒØÙ Ô Ø Đ Ü ÙÓÑ ØÝ ÓÒ ØÚÐÐ Ø ÓÓ Ý ¼ ½ Ü Æ Ü Æ Ø Ý ¼ Ü Æ ½ Ü Æ ½ Æ ºµ NR:n suositus: ÂÓ ØÖÚØÒ ÚÒ ÒØÖÔÓк ÔÓÐÝÒº ÖÚÓ Ö¹ ØÓÑ ÓÐ ÝÝØĐ ÑĐĐÖØØĐĐ ĐĐÒÙÒ ÔÓÐÝÒÓÑÒ ÖÚÓÒ Ð Ñ Ò ÐÙÚÒµ ÚÒ ØÙÐ ĐÝØØĐĐ ÑÑÒ ØĐ Đ ÐÙÚÙ Øй ØÝĐ ÑÒØÐÑĐº Perustelu: ÃÖØÓÑÒ ÑĐĐÖØØĐÑÒÒ ÓØ ÝØĐÐĐÓÖÝÑĐĐÒ ¾ º ½ Ü ½ Ü ¾ ½ Ü Æ ½ ½ ½ Ü ¾ Ü ¾ ¾ Ü Æ ¾ ½ º ½ Ü Æ Ü ¾ Æ Ü Æ ½ Æ ½¼ ¾ ½ ¾ º Æ ¾ Ý ½ Ý ¾ º Ý Æ

142 ÓÒ ÑØÖ Ò º ÎÒÖÑÓÒÒ ÑØÖ µ ÓÒ ĐÖĐÓÐØ º ÂÓ Ø ÖØ ØÒ ØĐ ØĐ Ò ĐÐÒ Ð ØÒ ÔÓÐÝÒÓÑÒ Ö¹ ÚÓ ÝÐÒ Đ Ñ Óص Ú ØÙ Ø ÙÒNR::polint غ ÐÓÖØÑ NR::polcoe º½¾½ Ð ÖØÓÑØ NR::polcof º½¾½ ÑÓÒ ØÓ Ò Ö ÑÒØÐÑĐÐÐĐº ÇÐÑ mypolin5.cpp ÓÐ ¹ ÑÖ NR::polcoeÒ ĐÝØĐÓ ØĐº ulotteinen interpolointi. ÇÐÓÓØ x1a[j], j=1,...,m, x1a[j]<x1a[j+1] x2a[k], k=1,...,n, x2a[k]<x2a[k+1] Ú ØÚ Ø ya[j][k]=y(x1a[j], x2a[k]) ØÙÐÙÓØÙ ÙÒØÓÒ ÖÚÓº ÀÐÙÑÑ ÑĐĐÖØØĐĐ ÙÒØÓÒ Ö¹ ÚÓÒ ÒØÖÔÓÐÓÒÒÐÐ ØÙÐÙÓØÙÒ Ô ØÒ ÙÐÓÔÙÓÐÐÐ Ô Ø Đ Ü ½ Ü ¾ µº ÎÐØÒ j k ØÒ ØØĐ x1a[j] Ü ½ x1a[j+1], x2a[k] Ü ¾ x2a[k+1]. ÅÖØĐĐÒ Ý ½ =ya[j][k], Ý ¾ =ya[j+1][k], Ý =ya[j+1][k+1], Ý =ya[j][k+1], t=( Ü ½ -x1a[j])/(x1a[j+1]-x1a[j]) ¾ ¼ ½ u=( Ü ¾ -x2a[k])/(x2a[k+1]-x2a[k]) ¾ ¼ ½ ÐÒÖÒÒ ÒØÖÔÓÐÓÒØ¹Ú Ý Ü ½ Ü ¾ µðð ÓÒ Ý Ü ½ Ü ¾ µ ½ ص ½ ÙµÝ ½ Ø ½ ÙµÝ ¾ ØÙÝ ½ صÙÝ ½½

143 ÈÖÒÒÙ ÑÓÐÐ ÙÙ ½µ ÓÖÚØÒ ÐÒÖÒÒ ÙÒØÓ ÔÓÐÝÒÓÑÐÐ ÓÖÑÔÒ Ó Ø¹ Ø ÖÚØØÓÒ ÑÓÐÐÒÒ ÔĐØÙÚÙÙ µ ¾µ ÔÝÖØĐĐÒ ÐĐĐÒÒØÖÔÓÐÓÒØÙÒØÓÓÒ 1. Polynomi-interpolointi Idea: ¹Å ½Ò ÖØк ÒØÖÔÓÐÓÒØ Ü ½ ¹ ÙÙÒÒ ¹Æ ½Ò ÖØк ÒØÖÔÓк Ü ¾ ¹ ÙÙÒÒ Toteutus: Ø ØĐĐÒ Ò Ò Å Æ ØÙÐÙÓÔ ØØØĐ ÒÒØÙÒ Ô ¹ ØÒ ÝÑÔĐÖÐØĐ Å Ü ½ ¹ ÙÙÒº Æ Ü ¾ ¹ ÙÙÒÒºµ ÌĐĐÒ Å ÒØÖ¹ ÔÓк Ü ¾ ÙÙÒÒ Ò ÙÒØÓÒ ÖÚÓØ Ô Øº (x1a[j], Ü ¾ ), j=1,...,m. ÆĐÒ ÚÙÐÐ ØĐĐÒ ÚÐĐ Ý ÒØÖÔÓк Ü ½ ¹ ÙÙÒØÒ Ò ÙÒØÓÒ ÖÚÓ Ø ØÝ Đ Ô Ø Đº 2. Bikuubinen interpolointi ÙÙ Ùµ ÒØÖÔÓÐÓÒÒ ÙØÒ ÓÐÑÙÔ ØØØĐ Ó¹ Ø ÒÒØÒ µ Ý ÝÜ ½ ÝÜ ¾ ¾ ÝÜ ½ Ü ¾ ÙÒØÓÒ ÖÚÓÒ Ð Đ ØÖÚØÒ ÑÝĐÓ Ñº ÖÚØغ Ç Ò ØÐÒÒØØ ÚÒÒÓÐÐ ØÚ ÙÚ ºº½ ÆÊÒ ÚÙÐØ ½¾º ½¾

144 ÙÙ Ò ÒØÖÔÓÐÓÒÒÒ ÓÑÒ ÙÙ µ ÒØÖÔÓÐÓÒØ ÒØ ÓÒ Ø Ò Ñº ÖÚÓØ ÓÐÑÙÔ Ø Đ µ ÒØÖÔÓÐÓÒÒÒ ÒØÑ ÙÒØÓ ÓÒ Ñº ÖÚØØÓÒÒ ØÙ¹ Ú ÑÝĐÓ ÖÖÝØØĐ Đ ÖÙÙÙ ØØÓ Òº ÙÙ Ò ÒØÖÔÓÐÓÒØÔÓÐÝÒÓÑÒ ÖÚÓÒ Ð ÑÒÒ ÖÙÙÙÒ Đ¹ Ô Ø Đ ØÔØÙÙ ÙÖÚ Ø ½µ ÒÒØÒ Ù Ò ÖÙÙÙÒ ÙÐÑÔ Ø Đ ÙÒØÓÒ Ø ¹ ÖÚØÒ ÖÚÓ ÙØÒ ÝÐÐĐ Ú µ ÝØÒ Đ ½ ÖÚÓµº ¾µ Çк Ø Ù ¾ ¼ ½ ÙØÒ ÐÒº ÒØÖÔÓÐÓÒÒ º ËÐÐÓÒ ÙÙ Ò ÒØÖÔÓÐÓÒÒÒ ÚØ ÓÚØ Ý Ü ½ Ü ¾ µ Ý ¼ ½ Ü ½ Ü ¾ µ Ý ¼ ¾ Ü ½ Ü ¾ µ Ý ¼¼ ½¾ Ü ½ Ü ¾ µ ½ ½ ½ ½ ½ ½ ½ ½ Ø ½ Ù ½ ½µ Ø ¾ Ù ½ ½µ Ø ½ Ù ¾ ½µ ½µ Ø ¾ Ù ¾ ÚÓØ Ò ÐÓÖØÑ Ø NR::bcucof Ð ÒÒ ØÖÚØÒ ÑÝĐÓ ÖÙÙÙÒ ÔØÙÙ ½ ÓÖÙ ¾µº µ ÎÖ Ò Ò ÒØÖÔÓÐÓÒÒÒ Ø NR::bcuintº // FILE: mybcu.cpp begins #include <iostream> #include <iomanip> #include <cmath> #include "nr.h" #include "gnusurf.h" #define SCALE 1 using namespace std; ½

145 // Driver for routine bcuint const DP xx_d[4]=0.0,2.0,2.0,0.0; const DP yy_d[4]=0.0,0.0,2.0,2.0; DP f(dp x, DP y) return tan(cos(x)+sin(x))*sin(x+y); DP ff(dp u, DP v) int i; DP ansy,ansy1,ansy2; DP x1,x1l,x1u,x2,x2l,x2u,xxyy; Vec_DP y(4),y1(4),y12(4),y2(4); Vec_DP xx(xx_d,4),yy(yy_d,4); x1l=xx[0]; x1u=xx[1]; x2l=yy[0]; x2u=yy[3]; for (i=0;i<4;i++) xxyy=xx[i]*yy[i]; y[i]=xxyy*xxyy; y1[i]=2.0*yy[i]*xxyy; y2[i]=2.0*xx[i]*xxyy; y12[i]=4.0*xxyy; x1=u; x2=v; NR::bcuint(y,y1,y2,y12,x1l,x1u,x2l,x2u, x1,x2,ansy,ansy1,ansy2); return ansy; int main(void) int i; DP ansy,ansy1,ansy2,ey,ey1,ey2; DP x1,x1l,x1u,x1x2,x2,x2l,x2u,xxyy; Vec_DP y(4),y1(4),y12(4),y2(4); Vec_DP xx(xx_d,4),yy(yy_d,4); ½

146 x1l=xx[0]; x1u=xx[1]; x2l=yy[0]; x2u=yy[3]; for (i=0;i<4;i++) xxyy=xx[i]*yy[i]; y[i]=xxyy*xxyy; y1[i]=2.0*yy[i]*xxyy; y2[i]=2.0*xx[i]*xxyy; y12[i]=4.0*xxyy; cout << endl << setw(6) << "x1" << setw(9) << "x2"; cout << setw(8) << "y" << setw(12) << "expect"; cout << setw(7) << "y1" << setw(11) << "expect"; cout << setw(7) << "y2" << setw(11) << "expect" << endl << endl; cout << fixed << setprecision(4); for (i=0;i<10;i++) x2=(x1=0.2*(i+1)); NR::bcuint(y,y1,y2,y12,x1l,x1u,x2l,x2u,x1,x2,ansy,ansy1,ansy2); x1x2=x1*x2; ey=x1x2*x1x2; ey1=2.0*x2*x1x2; ey2=2.0*x1*x1x2; cout << setw(8) << x1 << setw(9) << x2 << setw(9) << ansy; cout << setw(9) << ey << setw(9) << ansy1 << setw(9) << ey1; cout << setw(9) << ansy2 << setw(9) << ey2 << endl; double xxx[]=0.,2.,yyy[]=0,2.; gnusurf(ff,xxx,yyy,scale,0,"ff","testi"); cout << "Program ended normally." << endl; return 0; // FILE: mybcu.cpp ends ½

147 testi Muita mahdollisuuksia ÙÙÒÒ ÔÐÒ ÐÓÖØÑØ NR::splie2, splin2 º ½¾º 3.7. Polynomien sovelluksia. Numeerinen derivointi. ËÙÖÚ ÑÖ¹ ÚÐ ÑÒ ÒÙÑÖ Ò ÖÚÓÒÒÒ ÑÔÐÑÒØÓÒÒÒ Ñ¹ ÓÐÐ ÙÙ ØÓ Ò Ë ¾º º Ñ٠غ ÄĐØĐÓÓØÒ ÓÒ Ø¹ ÚĐÐ Ø ØÙÐÙÓÙØ ÙÒØÓÒ ÖÚÓغ ÀÐÙÑÑ ÐĐÓÝØĐĐ ÔÔÖÓ ¹ ÑØÓØ ÖÚØÒ ÖÚÓÐк ÖÚÓ ÓÒ ÓÐØÚ ÚĐÒØĐĐÒ ÔÔÐØغ ÂÓ ÖÚÓ ÓÒ Ø Ò ÚÓÒ ÖÚØÒ ÐÖÚÓÒ ĐÝØØĐĐ ÖÓØÙ Ó ÑĐĐÖĐĐ Ý ¾ Ý ½ µ Ü ¾ Ü ½ µ ÌÖ ØÑÑ ÙÖÚ ØÓ Ò Ë ÓÒ ¾º º ÑÙ Ø ØÐÒÒØØ ÙÒ ÖÚÓ ÓÒ Ú º ÇÐÓÓÒ ¼ Ô ¾ ½ ¼ ½ ¾ ØÙÐÙÓÙØ ÙÒØÓÒ ÖÚÓØ Ô Ü ¼ Ôµº ËÐÐÓÒ Ò ÒÙÑÖ ÐÐ ÖÚØÐÐ ÓÒ ÐÙ ÖÑÓÛØÞ¹ËØÙÒ ¾º ºµ ¼ Ü ¼ Ôµ ¾ ½ ¼ ½ ¾ ¾ Ô Ô ¾ Ô ½µ½¾ Ô Ô ¾ Ô µ ¾ Ô Ôµ¾ Ô Ô ¾ Ô µ ¾ Ô Ô ¾ Ô ½µ½¾ Ô ¾ ½ ¼ ½ ¾ ½

148 ÀÚØÒ ØØĐ ÖÚØÒ ÐÙ Ô Ø Đ Ü Ô Ô ¾ ½ ¼ ½ ¾ ÓÒ ÔÒÓØØØÙ ÖÓØÙ Ó ÑĐĐÖĐ ÓÒ ÔÒÓÖØÓÑØ ÖÔÔÙÚØ Ô ØĐº ÃÖØÓÑÒ ÒÙÑÖ Ø ÖÚÓØ ÐÑÒÚĐØ ÙÖÚ Ø ÚÓ Ø p a -b c -d e -2-25/12 24/6-6/2 8/6-3/ /12-5/6 3/2-3/6 1/12 0 1/12-4/6 0/2 4/6-1/12 1-1/12 3/6-3/2 5/6 3/12 2 3/12-8/6 6/2-24/6 25/12 ËÒĐ ØÔÙ ØØĐ ØÙÐÙÓØÙ ÖÚÓ ÓÒ Ñ ÔÐ Ñ µ ÑÒØÐÐĐĐÒ ÙÖÚ Øº ÃÓ Ü ¾ Ñ ¾ ÓÚÐÐØÒ ÝÓº Ú ÖÚÓÐÐ ¾ ½ ½ ¾ ØÔÙ Ô ¼ ÃÓ Ü ½ ¾ ĐÝØØĐĐÒ ÖÚÓ ½ Ú ØÔÙ Ô ¾ Ø Ú ØÚ Ø Ô ½ È Ø Đ Ü Ñ ½ Ñ ĐÝØØĐĐÒ ÖÚÓ Ñ Ñ Ú ØÔÙ Ô ½ Ø Ú ØÚ Ø Ô ¾ // FILE: mynumder.cpp begins #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> #include <cmath> using namespace std; #include "nr.h" #include "matutl02.h" #define MAXD 50 #define PI M_PI using namespace std; void numder(const Vec_DP seq1, Vec_DP &seq2, double h, int n) ½

149 /* A numerical approximation of the derivative of a function f is computed, given evenly spaced function values f[a+i h], i = 1,...,n, stored in seq1 in this order. The values of the derivative Df[a+i,h], i = 1,...,n are returned in seq2. The computation is based on the five-point formula in Abramowitz-Stegun It is required that n >= 5. */ int i, ilow = 1, ihigh = n, p, p2, p3; double a, b, c, d, e; if ((ihigh - ilow + 1) < 5) fprintf(stderr,"\ntoo few points for numerical differentiation.\n"); else for(i = ilow; i <= ihigh; i++) if (i <= ilow + 2) p = i - ilow - 2; if ((i > ilow + 2) && (i <= ihigh - 2)) p = 0; if (i > ihigh - 2) p = i - ihigh + 2; p2 = p * p; p3 = p * p2; a = ((2.0 * p3) - (3.0 * p2) - p + 1.0) / 12.0; b = ((4.0 * p3) - (3.0 * p2) - (8.0 * p) + 4.0) / 6.0; c = ((2.0 * p3) - (5.0 * p)) / 2.0; d = ((4.0 * p3) + (3.0 * p2) - (8.0 * p) - 4.0) / 6.0; e = ((2.0 * p3) + (3.0 * p2) - p - 1.0) / 12.0; seq2[i] = (a * seq1[i - p - 2]) - (b * seq1[i - p - 1]) + (c * seq1[i - p]) - (d * seq1[i - p + 1]); seq2[i] = (seq2[i] + (e * seq1[i - p + 2])) / h; double f(double x) return sin(x); int main() double h=1e-5, x0 =1.1; Vec_DP y(6),dy(6); ½

150 int i; for (i=1;i<=5;i++) y[i]= f(x0+(i-3)*h); numder(y,dy,h,5); printf(" x df(x) virhearvio \n"); //cout.setf(ios::scientific); cout.precision(8); for (i=1;i<=5;i++) cout<<setw(10)<<x0+(i-3)*h<<setw(12)<<dy[i]; cout<<setw(20)<<dy[i]- cos(x0+(i-3)*h)<<endl; return 0; // FILE: mynumder.cpp ends ÇÐÑÒ ØÙÐÓ ØÙ ÓÒ ÙÖÚ x df(x) virhearvio e e e e e-11 ËÙÖÚ ÓÐÑ numdf ØÖÓ ÑÒ ÓÙ ØÚÑÑÒ ÙØ Ùع ÚÒ ÓØÒ Ð ĐÓÑÒ ÙÙ ÓÐÑÒnumder ÚÖÖØØÙÒ ÓØ numdf ÙØ ÙÙº Ä ÑÑ ÚĐÐÐÐĐ µ ÑĐĐÖØÐÐÝÒ ÙÒØÓÒ ÒÙѹ Ö ÐÐ ØÓ ÐÐ ÖÚØÐÐ ÐÖÚÓÒ Ô Ø Đ Ü ÌÖÓØÙ Ø ÚÖØÒ Ð ÑÑ Ò Ò ÙÒØÓÒ ÖÚÓØ Ô Ø Đ Ü Ô Ô ¾ ½ ¼ ½ ¾ ÙÓÐÑÑ ØĐ ØØĐ Ü ¾ Ü ¾ ËÓÚÐÐÑÑ ÓÐÑ numder ÙÒØÓÒ ÖÚÓÒ ÑÙÓÓ ØÑÒ ØÙÐÙÓÓÒº // FILE: mynumdf.cpp begins #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> ½

151 #include<cmath> using namespace std; #include "nr.h" #include "numder.cpp" using namespace std; double numdf(double f(double),double a,double b,double x,double h,int n) /* A numerical approximation of the derivative of a function f defined on (a,b) is computed at x. The computation is based on the five-point formula in Abramowitz-Stegun with step h. If x <a+2h or x>b-2h the step length if reduced. */ int i; Vec_DP seq1(6),seq2(6); double dx =h; if (( x <= a) (x>=b)) cerr<<"\n Argument error in numdf, x = "<<x<<endl; exit(1); if (x-2*h < a) dx= (x-a)/3; if (x+2*h > b) dx= (b-x)/3; for (i=1;i<=5;i++) seq1[i] = f(x+(i-3)*dx); numder(seq1,seq2,dx,5); if (n == 2) numder(seq2,seq1,dx,5); return( seq1[3]); else if (n==1) return(seq2[3]); else return 0.0; double f(double x) return sin(x); double tst(double x) return (f(x) +numdf( f, x-1.0, x+1.0, x, 1E-5, 2)); ½¼

152 int main() double x; int i; cout<<" x D(D(sin(x))) virhearvio \n"; // cout.setf(ios::scientific); cout.precision(6); for (i=1;i<=5;i++) x=0.1*i; cout<<setw(10)<<x<<setw(14)<< numdf( f, x-1.0, x+1.0, x, 1E-5, 2); cout<<setw(18)<<tst(x)<<endl; return 0; // FILE: mynumdf.cpp ends x D(D(sin(x))) virhearvio e e e e e Käyrä annettujen pisteiden kautta. ÒÒØÙÒ ÒÒÒĐÒ Ø ÓÔ ¹ ØÒ Ü Ý µ ½ Ò ÙØØ ÚÓÒ ÔÖØĐĐ ÓÒ Ø ÓĐÝÖĐ ÙÖÚ Øº ÇÐÓÓÒ Ø Ô Ø ØĐ ½ Ô Ø Ò ÚĐÐÔ ØÒ ÙØØ ÔÖÖØÝÒ ÑÙÖØÓÚÚÒ ÔØÙÙ º Ø ØĐĐÒ ĐÝÖĐÒ ÔÖÑØÖ¹ ÑÙÓØÓ Ø ÝØĐÐĐÓĐ ÑÙÓÓ Ô Øµ Õ Øµµ ÙÓÑ ØØĐ Ø ÓĐÝÖĐĐ ÝÐ Đ ØÔÙ ÚÓ ÒØ ÑÙÓÓ Ý Üµµ Ñ Đ Ô Ø µ Õ Ø µµ Ü Ý µ ½ Ò ½ Ô Õ ÓÚØ ÓÔÚ Ò¹ ØÖÔÓÐÓÒØÙÒØÓغ ÃĐÝØØĐÒ ÓÐÑ gnuplt1 ØÑÑ ÒÝØ Ó¹ ÐÑÒ Ó ÑÖØ Ô ØØ ÙÚÖÙÙÙÐÐ ÔÖØĐĐ ÒÒ ÙØØ ÔÐÒ¹ÒØÖÔÓÐÓÒÒÒ ÒØÑÒ ĐÝÖĐÒº ÂÓ ÐÙØØ Ò ØØĐ ĐÝÖĐ ÓÐ ÙÑÔÙØÙÚ ÓÐ ØØØÚ ÚÑÒÒ Ô Ø Ñ ÙÒ Ò¹ ÑÑĐÒÒº ÎÓØ Ò ÑÝĐÓ ÓÐРѺ ÔÓÐÝÒÓѹÒØÖÔÓÐØÓØ ÑÒ ØÖÓØÙ Òº ½½

153 // FILE: mysptrp2.cpp begins // Spline through points. Given a set of points // in the plane, a curve is drawn through these points. // Points are in the file myspt.dat #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include <cmath> #include "nr.h" #define PRINT 1 #include "matutl02.h" #include "plot.h" #define NP 20 #define MP 20 #define MAXSTR 80 static void tabf(vec_dp &xx,vec_dp &yy,int n,const char *name) ofstream df(name); int i; if (!df) abort(); for (i = 0; i < n; i++) df<<xx[i]<<" "<< yy[i]<<endl; df.close(); DP dist(dp x1, DP y1, DP x2, DP y2) return pow( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2), 0.5); ½¾

154 void getpoints(vec_dp &Xa, Vec_DP &Ya1, Vec_DP &Ya2, int &number) int j; const char *fname= "mysptrp3.dat"; Mat_DP a(mp,np); a=getmat(fname); showmat(a); int n = a.nrows(); number=n; cout<<"number = "<<n<<endl; Vec_DP ya1(n); Vec_DP ya2(n); Vec_DP xa(n); for (j=0;j<n; j++) (ya1)[j]=a[j][0]; (ya2)[j]=a[j][1]; (xa)[0]=0.0; for (j=0;j<n-1; j++) (xa)[j+1]=(xa)[j]+dist((ya1)[j], (ya2)[j], (ya1)[j+1], (ya2)[j+1]); cout<<setw(10)<<j<<setw(16)<<(xa)[j+1]<<endl; Xa=xa; Ya1=ya1; Ya2=ya2; cout<<"press enter:"; getchar(); int main() DP a,b,x,y,yp1, ypn; int n, j, m; Vec_DP xa(1),ya1(1),ya2(1),xx(100),yy(100); // yp1 =0.3; ypn=1/0.3; // yp1 =1e30; ypn =1e30 Luonnollinen splini getpoints(xa,ya1,ya2,n); // n=xa.size(); Vec_DP y2(n),y3(n); tabf(ya1,ya2,n,"tmp1.dat"); yp1 = ((ya1)[1] - (ya1)[0]) / ((xa)[1] - (xa)[0]); ypn = ((ya1)[n-1] - (ya1)[n-2]) / ((xa)[n-1] - (xa)[n-2]); yp1 = ypn = yp1 + ypn; ½

155 NR::spline(xa, ya1, yp1, ypn, y2); yp1 = ((ya2)[1] - (ya2)[0]) / ((xa)[1] - (xa)[0]); ypn = ((ya2)[n-1] - (ya2)[n-2]) / ((xa)[n-1] - (xa)[n-2]); yp1 = ypn = yp1 + ypn; NR::spline(xa, ya2, yp1, ypn, y3); a=(xa)[0]; b=(xa)[n-1]; m=100; for (j=0;j<100;j++) x=a+(b-a)*(j-1)/99; NR::splint(xa,ya1,y2,x,y); xx[j]=y; NR::splint(xa,ya2,y3,x,y); yy[j]=y; cout<<j<<setw(14)<<xx[j]<<setw(14)<<yy[j]<<endl; tabf(xx, yy,100, "tmp2.dat"); plot("tmp1.dat","b-3", "tmp2.dat","r-2",null); return 0; // FILE: mysptrp2.cpp ends /* TIEDOSTO mysptrp2.dat: */ /* TIEDOSTO mysptrp.dat: */ ½

156 /* TIEDOSTO mysptrp3.dat: */ Generoitu spline-tiedosto: (...) ËÑÐÐ ÑÒØÐÑĐÐÐĐ ÚÓÒ ÐÔÓ Ø ÒÖÓ ÑÙØ Ú Ø¹ Ú ÙÚº ½

157 ½º ½º¾ ½ ¼º ¼º ¼º ¼º¾ ¼ ¹¼º¾ ¹¼º ¹¼º ¹¼º¾ ¼ ¼º¾ ¼º ¼º ¼º ½ ½º¾ ½º ÅÓÒ ¼ ¼½¾½¼¾ ¾¼¼¾ ½

158 4 "a.dat" "tmp2.dat" "tmp1.dat" ½

159 4 NUMEERINEN INTEGROINTI ÈÒعÐÓÒ ØÐÚÙÙ Ò ÑĐĐÖØÝ ÓÒÐÑØ ÓÚØ ÖĐØĐ Ñع ÑØÒ ÚÒÑÔ ÓÚÐÐÙ ÓØغ ÆĐÑĐ ÓÒÐÑØ ÚÓÒ Ô¹ ÐÙØØ ÒØÖÐÒ Ð Ñ Òº ÃÓ ÚÒ ÙØÐÐ Ò ÖÚØ Ò¹ ØÖÐØ ÔÝ ØÝØĐĐÒ Ð ÑÒ Ø Ø ĐÝØØĐĐÒ ØÚÐÐ Ø Ð¹ ÖÚÓ ÒÙÑÖ Ø ÒØÖÓÒغ ÆÙÑÖ Ò ÒØÖÓÒÒÒ ÝÒÓ¹ ÒÝÝÑ ÓÒ ÚÖØÙÙÖº ÃÚÖØÙÙÖÑÒØÐÑĐ ĐÝØØĐĐÒ ÑѺ Ó ¹ Ò Ò º ÐÑÒØØÑÒØÐÑĐĐ Ó ÓÒ Ó ØØ ÖÒØÐÝØĐÐĐÓÒ ÒÙÑÖÒÒ ÖØ ÙÑÒØÐÑĐº Numeerisen integroinnin perustehtävä: Ä Ê ÜµÜ ÙÒ ÓÒ ØÙÚ ½ ½ ÅÓÐÐ ÓÒÐÑØÐÒØØ µ ÔĐÓÐÐÐÒÒ ÒØÖÐ ÐÐĐ ĐĐÖØØĐÓÑÝÝ Ô ØØĐ µ Ò ÖÙ ÐØÐÙ ØÖĐÚĐØ ÙÔÙغ ÌÖÔÒ ÚØ ØĐĐÒ Ð ĐÖÓØÙ º ÑÖ Ó Ò¹ ØÖÓØÚ ÙÒØÓ ÓÒ ÐÙÓ ÒÒ ÚÖØÙÙÖÚÓÐÐ ÚÓ¹ Ò ÓØ ÚÖÖÚÓØ ÚÖغ ÐÐÓÐÚØ Úصº Tavoite: ÈÝÖØĐĐÒ ÚÙØØÑÒ ÑÓÐÐ ÑÑÒ ÝÚĐ ÔÔÖÓ ¹ ÑØÓ ÑĐĐÖĐØÝÐÐ ÒØÖÐÐÐ ÑÓÐÐ ÑÑÒ ÖÚÓÐÐ ÙÒØÓÒ ÖÚÓÒ ÑĐĐÖØÝ ÐÐĐº ÚÓÒ ÚÖØÙÙÖ ĐÝØĐ ÔĐĐØÔ ØÖÚÓ µ µ ËÙÐØØÙ ÚÖØÙÙÖ ĐÝØØĐĐ ÔĐĐØÔ ØÖÚÓº ÚÓÒ ÚÖØÙÙÖ ÚÓ ÓÚÐØÙ ÑÝĐÓ ØÔÙ Ò µ ½ Ø µ ½ ËÙÐØÙÐÐ ÚĐÐÐÐĐ ØÙÚ ÙÒØÓØ ÒÙÑÖ Ø ÒØÖÓØ ÚÓÒ ÑÙÓÓ Ø ÚĐÐÒ Ø ÚĐÐÒÒ Ó ÒØĐĐÒ ÑĐĐÖĐĐÒ Ó ÚĐÐĐ ÙÐÐÒ Ó ÚĐÐÐÐĐ ĐÝØØĐĐ ÔÒعÐÓÒ ÔÔÖÓ ÑÓÒ¹ ØÒ ÙÓÖÙÐÑÓØ Ø ÔÙÓÐ ÙÙÒÒغ ÌÓÒÒ ÑÓÐÐ ÙÙ ÓÒ ÓÚÐØ ÑÒ Ò ØØÝÒÑÔĐ ÚÖ ÓØ Ò º ÚÖØÙÙÖ¹ ÚÓº Æ ÚÓÚØ ÔÖÙ ØÙ ÔÔÖÓ ÑÓÚÒ ÓÒ ØÒÒÝ Ò Ø ÙÒØÓÒ ÚÙ Ø ÐØÐÙ ÙÓÑÓÚÒ ÔÒÓÙÒØÓÒ ĐÝØØĐÓĐÓÒº ÈÖØĐÑĐÐÐĐ ÙÚ Ò Ú ÙÐÒÒ ÚÙØÐÑ ÙÒØÓÒ ÙÐ٠غ ÂÓ ÙÒØÓ ÐØÐ ÖÙ Ø ÚÓÒ ÚÖÙØÙ ÚÙ¹ ½

160 Ò ÒÙÑÖ ÒØÖÓÒÒ º ÒÐÝÝ Ò ÐÐÐĐ ÐÑ ØÙÒ ¹ ÐØÐÙ ÒĐÝÝ ÒĐ ØØĐ ÙÒØÓÒ ÓÖÑÑØ ÖÚØØ ÚÚØ ÓÐÐÓÒ ÑÝĐÓ Ò ÚÖÖÚÓ ÚÖØÙÙÖÚÓ ÙÓÒÓÒº 4.1. Tasaväliset jaot. ÅÖØĐĐÒ Ü Ü ¼ ¼ ½ Æ ½ Ü µ ÌĐÖÑÔĐ ÚÖØÙÙÖÚÓ ÓÚØ ½µ ÈÙÓÐ ÙÙÒÒ Ú ØÖÔØ Úµ Ü ¾ ¾µ ËÑÔ ÓÒÒ Ú Ü Ü½ ÜµÜ ½ ¾ ½ ¾ µ Ó ¼¼ µ ÜµÜ ½ ܽ ½ ¾ ½ Ç µ µ µ ËÑÔ ÓÒÒ Ú Ü Ü½ ½ ¾ Ç µ µ N-pisteen kaavoja. (suljettu tapaus) ÌÒØĐÑĐÐÐĐ Ó ÓÚÐع ÑÐÐ ØÒÒØØÝÝÒ ÓÓÒ Ñº ÚÓ Ò ÙÖÚØ Úغ µ Puolisuunnikaskaava, N-pistettä: ÐÓÖØÑ NR::qtrap ÜÆ Ü½ ÜµÜ ½ ¾ ½ ¾ Æ ½ ½ ¾ Æ Ç µ ¼¼ Æ ¾ µ µ Simpsonin kaava, N-pistettä: ÐÓÖØÑ NR::qsimp ÜÆ Ü½ ÜµÜ ½ ½ ¾ ¾ ¾ Æ ¾ Æ ½ ½ Æ Ç ½ Æ µ ½

161 ÖĐ ÑÒØÐÑĐ ÚÓÒ ½µ¹ µ ÒÒ ÖÐ ØÒ ÚÖÒØØÒ ÓØÑ ÐÐ ÔÖÙ ØÙÙ ÑĐĐÖĐĐÑĐØØĐÓÑÒ ÖØÓÑÒ ÑÒØÐÑĐĐÒ ÙØÒ ÐÐĐ Ó ÒĐØÒ ÓÐÑÒ mynumint.cpp ÝØÝ Đº ù ÚÓ ÒØÝÚĐØ ÖØÓÑØ ØÒ Ø ØÑÐÐ Ú ÑÓÒÓÑÙÒ¹ ØÓÐÐ ÖØ ÑÐÐ ÑÙÓÓ ØÙÚ ÐÒÖÒÒ ÝØĐÐĐÓÖÝÑĐº 4.2. Jaon tihennys. ÐÐĐ ÑÒØØÙ ÒØÖÓÒØÚÓ ÚÓÒ ĐÝØØĐĐ ÑÝĐÓ ØÖØÚ Ø ØÒ ØØĐ ÓÔ ØØØÒ ÚĐÐÒ Ø¹ ØÒ ÙÙ ÓÔ ØØĐº ÌĐÐÐĐÓÒ ÚÓÒ Ó Ð ØØÙ ÙÒØÓÒ ÖÚÓ¹ ĐÝØØĐĐ ÝÚĐ ÓØÒ Ð ÒÒÒ ÑÑ Ú ØØÝ ØÝĐÓ ÑÒ ÙÒº ÂÓÒ ØÒØĐÑ ØĐ ØØÒ ÙÒÒ ÐÙØØÙ ØÖÙÙ ÚÙØØÒº ÐÓÖØÑ NR::trapzd, qtrapº 4.3. Rombergin metodi. Ì ÚĐÐ Đ Ó Ó ÓÔ ØÒ ÚĐÐÑØ ÓÒ ÒØÖÐÐÐ ØÙ ÔÔÖÓ ÑØÓ Á µ ÖÔÔÙÙ Ô¹ ÖÑØÖ Ø ÂÓ ØÒÒØØĐ Đ ÑÙÓÓ ØØÒ ÔÒÒÚĐ ĐĐÖÐÐÒÒ ÓÒÓ ÐÙÙ ¼ ÙÐÐÒ Ð ØÒ Ú ØÚ ÔÔÖÓ¹ ÑØÓ Á µ ÂÓÒ ØÒÒÝ ØĐ ÚÓÒ ĐÝØØĐĐ Ý ØÑØØ Ø ÝÚĐ º Æ º ÊÓÑÖÒ ÑÒØÐÑĐ Đ ØĐÑĐ ØÔØÙÙ ÙÖÚ Øº Ä ØÒ ÔÙÓÐ ÙÙÒÒ ÚÒ ÒØÑ ÖÚÓ Á µ ÒØÖÐÐÐ Ê ÜµÜ Ú ØØÒ ÚĐÐÒÔØÙÙ ½ Ò Ñ Đ ½ ØÖÔÓÐÓÒ ÆÚÐÐ³Ò ÐÓÖØÑÒ ÚÙÐÐ ØÐÒØ Ò ¼ Ø ÓÒ ÔÖÙ ØÐÐÒÒ ÐÓ ØÙ Ö ËØÓÖ¹ÙÐÖ Ë º й ÓÖØÑØ NR::qromb, qromo ÐØØÝÚĐØ ÊÓÑÖÒ ÑÒØÐÑĐĐÒº ÐÐ ÓÒ ØØØÝ ÓÐÑÒ ĐÝØØĐÓ ÑÖ ØÔÙ Ó ÒØÖÐ ÚÓÒ Ð ÑÝĐÓ Ø Øº // FILE: myqromo.cpp begins #include<iostream> #include<iomanip> #include<cmath> #include "nr.h" using namespace std; #define X1 0.0 #define X2 1.0 #define X ½¼

162 #define AINF 1.0E20 #define PI M_PI DP globalp=2.0; static DP ff(dp x) return (pow(x, -1.0/globalp)) ; int main() DP result,res2; int p; cout<<"\nimproper integrals:\n\n"; cout<<"\n int_0^1 x^-1/p dx = p/(p-1): \n \n"; cout<<" p Numerical Exact Error \n"; for (p=2;p<10;p++) globalp=p*1.0; res2=(dp)(p/(p-1.0)); result=nr::qromo(ff,x1,x2,nr::midsql); cout<<setw(2)<<p<<setw(12)<<result; cout<<setw(12)<<res2<<setw(14)<<result-res2<<endl; cout<<"\nimproper integrals:\n\n"; cout<<"\n int_1^infty x^-p dx = 1/(p-1): \n \n"; cout<<" p Numerical Exact Error \n"; for (p=2;p<10;p++) globalp=1.0/p; res2=(dp)(1.0/(p-1.0)); result=nr::qromo(ff,x2,x3,nr::midinf); cout<<setw(2)<<p<<setw(12)<<result; cout<<setw(12)<<res2<<setw(14)<<result-res2<<endl; return 0; // FILE: myqromo.cpp ends Improper integrals: int_0^1 x^-1/p dx = p/(p-1): p Numerical Exact Error e e-06 ½½

163 e e e e e-06 Improper integrals: int_1^infty x^-p dx = 1/(p-1): p Numerical Exact Error e e e e e e e e-17 ÑÖĐ ÔĐÓÐÐÐ Ø ÒØÖÐ Ø ÓÚØ Ê ½ Ü ½ Ü ¾ Ê ½ ÔÜ ¼ Ü ÆĐÑĐ ØÔÙ Ø ÚÓÒ Đ ØÐÐĐ Ñº ÓÐÑÒ ÑÙÙØØÙÐÐ ÚÖ ÓÐк ÆĐÒ ØÔÙ Ò ÐØØÝÚĐ ÔÙÓÐÑ ÓÚØNR::midpnt, midinf, midsql, midsqu NR::midexpº NR::midsql NR::midsquµ ÓÚÐØÙÙ ĐÝØØØĐÚĐ Ý ĐNR::qromoÒ Ò ØÐÒØ Ó ÒØÖÐÐÐ ÓÒ ÒØÖÓØÙÚ ÒÙÐÖØØØ ÐÖÐÐ ÝÐĐÖÐе ÙØÒ ÙÖÚ ØÔÙ ½ ¼ Ü Ô Ü ½ ¼ Ü Ô ½ Ü ÐÐĐ ÓÐÑ myqromo.c ÒÒØØÒ ÑÖ ÐÓÐÑÔÖÒ NR::qromo, midsql ÝØ ØÓÑÒÒ Øº Î ØÚ Ø ÚÓÒ Đ ØÐÐĐ ØÐÒÒ Ó Đ ÝÐĐ¹ ØØĐ ÐÖÐÐ ÓÒ ÒÙÐÖØØغ Esim. ½ ¼ Ü Õ Ü ½ ܵ ¼ ½ ¼ Á ½ Á ¾ ½¾

164 Ñ Đ ÓÒ ÓÔÚ ÔÒ ÔÓ ØÚÒÒ ÐÙÙº ÐÐÒ Á ½ NR::qromo(f,s, 0.5,midsql) Á ¾ NR::qromo(f, 0.5,1.0-s,midsqu) ÅÓÒÔÙÓÐÒÒ ÓÓÐÑ ÚÖØÙÙÖÚÓ ÓÒ Ñº ØÓ ÖÑÓÛØÞ¹ËØÙÒ Ë ÐÙÙ ¾º 4.4. Gaussin kvadratuuri ÎØÓÖÚÖÙÙ Ò ØÓÖ Ø ØÙØØÙ ÓÖØÓ¹ ÓÒÐ ÙÙÒ Đ Ø ÚÓÒ ÝÐ ØĐĐ Ö ØÚÓÒº ÈÖÝÑÑ ÒÝØ ÖĐĐ Ò ØĐÐÐ Ò ÒÙÑÖÒ ÒÒÐØ ÚÖ Ò ÝĐÓÝÐÐ Ò ÝÐ ¹ ØÝ Ò Ó ÚØÓÖÚÖÙÙÒ ÑÙÓÓ ØÚØ ÚĐÐÐÐĐ ÑĐĐÖØÐÐÝØ ØÙÚØ ÙÒØÓغ ÇÐÓÓØ ØĐÐÐ ÙÒØÓØ Ï ÓÒ Óй Ñ ÙÒØÓ ÓØ ÙØ ÙØÒ ÔÒÓÙÒØÓ º ËÒĐ ØÔÙ ØØĐ Ñº ÙÒØÓØ ÓÚØ ÖØØĐÚĐÒ ĐĐÒÒĐÓÐÐ Đ ÓÐÐÓÒ Óº ÒØÖ¹ ÐØ ÓÚØ ÝÚÒ ÑĐĐÖØÐØÝĐ ØÚÐÐ Ø Ï Üµ ¼ Ü ¾ ØÙÚµ ÑĐĐÖØØÐÑÑ ÙÒØÓÒ ĐØÙÐÓÒ ÚÐÐ Ï Üµ ܵ ÜµÜ ÙÒØÓØ ÓÚØ ÓÖØÓÓÒÐ Ó ÒÒ ĐØÙÐÓ ÓÒ ¼º ÙÒ¹ ØÓØ ÓÒ ĐØÙÐÓ Ø Ò Đ Ò ÓÒ ½ ÒÓØÒ ÒÓÖÑØØÙ º ÂÓ ÒÓÖÑØØÙÒ ÙÒØÓÓÙÓÒ ÙÒØÓØ ÓÚØ ÓÖØÓÓÒÐ ÒĐĐÒ ÓÙÓ ÒÓØÒ ÓÖØÓÒÓÖÑÐ º ÎÓÑÑ ÓÒ ØÖÙÓ ÓÖØÓÒÓÖÑØØÙÒ ÓÙÓÒ ÔÓÐÝÒÓÑ Ó ÓÒ ØĐ ÑĐÐÐÒ Ý ÔÓÐÝÒÓÑ Ô Üµ ÙØÒ ØØØ ¼ ½ ¾ ÊÙÖ ÚÒÒ ÓÒ ØÖÙØÓ ØÒ ÙÖÚ Øº ØØÒ Ô ½ ܵ ¼ Ô ¼ ܵ ½ Ñ Đ Ô ½ ܵ Ü µô ܵ Ô ½ ܵ ¼ ½ ¾ ÜÔ Ô Ô Ô ¼ ½ ¾ Ô Ô ½ ¾ Ô ½ Ô ½ ÃÖÖÓÒ ¼ ØØÒ ÑÐÚÐØ Ø ÚÐØ ÑÑ Ò ÒÓÐÐ º ½

165 ÇÖØÓÓÒÐ ÐÐ ÔÓÐÝÒÓÑÐÐ ÓÒ ØĐÖØĐ ÓÚÐÐÙ ÑѺ ÒÙ¹ ÑÖ Ò ÒØÖÓÒØÒº ÁÒØÖÐÒ Ï Üµ ÜµÜ Æ Û Ü µ ÔÔÖÓ ÑÓÒÒ ÚÓÒ Ø Ü ÔÒÓØ Û ÚÐØ ÒÒ ØØĐ Ú ÔĐØ ÝØĐÐĐÓÒĐ ÐÐ ÒÒØĐĐÒ ØØØ ¾Æ ½µ ÓÐÚÐÐ ÔÓÐÝÒÓÑÐк ÌĐÑĐ ÓØÙÙ ØĐ ØØĐ Ú ÓÒ ¾Æ ÔÖÑØÖ ÒÑØØĐÒ ÔÒÓØ Û Ø Ü ÃÖÑÑ ØØÐ ÚÙÐÐ ½½ Ù Ø ÒÙÑÖ Ò ÒØÖÓÒÒÒ ÝØÝ Đ ÒØÝÚĐ ÓÖØÓÓÒÐ ÔÓÐÝÒÓѺ ÅÒØØÓÓÒ ÒĐ ØĐ Ù Ò¹ÄÒÖÒ ÔÓÐÝÒÓÑ Ï Üµ ½ ½ Ü ½ ½µÈ ½ ¾ ½µÜÈ È ½ ÐÓÖØÑ NR::gauleg ÒÓÙØÙÙ ØĐÑĐÒ ÒØÖÓÒØÔÓÐÝÒÓÑÒ ĐÝع ØĐÓĐÓÒº Ù Ò ÚÖØÙÙÖÚØ ÔÓÙØÙÚØ ÓÖØÓÓÒÐ Ò ÔÓÐÝÒÓ¹ ÑÒº ÅѺ Ô ØØ Ü ÚÐØÒ ØÖÓØÙ Ò ÔÖØÒ ÓÔÚÐÐ ØÚÐÐ ÑÓÐÐ Ø ¹Ø ÚĐРغ ÂÓÔ ØØ Ü ÑĐĐÖĐÝØÝÚĐØ ÓÖØÓÓÒÐÔÓÐÝÒÓÑÒ ÓÑÒ Ù٠غ ØÙÒ ÓÒ ØØĐ Ò Ð ĐĐ ÚÔÙ ØØ ØÖÙÙØغ ËÙÖÚ ÓÐÑ ØÖ ØÐ ÐÓÖØÑÒ NR::gauleg ÑÙ Ø ÒÙÑÖ Ø ÒØÖÓÒغ ÐÓÖØÑÒ Ó Ò ÓÒ Ô ØÒ Ü ÔÐÐ ¹ ØÑÒÒ Ù Ò ÚÖØÙÙÖÒ Ñ٠غ ËÓÚÐÐÑÑ ÐÓÖØÑ ØÔÙ Ò Ñ Đ ÒØÖÒÒ ÓÒ ÙÒØÓ È Å ½ Ò Üµ Ñ Đ ÓÚØ ØÙÒÒ ÚØÓÖغ ÌÖÙÙ ÖÚÓØ ÚÖØÒ ØÙÐÙÓÑÑ ÚÖÙÒØÓÒ ff3(x) Ó ÐÑÓØØ ØÒ Ò¹ ØÖÐÒ ÒÙÑÖ Ò ÒØÖÐÒ ÚĐÐ Ò ÖÓØÙ Ò ÒØÖÓÒÒÒ ÝÐĐÖÒ ÙÒØÓÒ ÙÒ ÒØÖÓÒØÚĐÐÒĐ ÓÒ ¼ Ü ½ // FILE: mygleg.cpp begins // Integrand is \sum_j=1^m a[j]*sin(b[j]*x) // with a and b random numbers and exact integral // \sum_j=1^m -(a[j]/b[j])*cos(b[j]*x) #include <cmath> ½

166 #include <cstdlib> #include <cstdio> #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> #define PRINT 1 using namespace std; #include "nr.h" #include "gnuplt1.h" #include "matutl02.h" #define NPOINT 10 #define MTERM 10 #define X1 0.0 #define X2 1.0 #define X3 5.0 // X1, X3 are the lower, upper bounds of integration double a[mterm], b[mterm]; // MTERM is an upper bound for M int M; // M is the number of sine terms double myfunc(double x) // myfunc gives the values of the sine sums double s=0.0; for (int j=0;j<m; j++) s+=a[j]*sin(b[j]*x); return s; double myfunc2(double x) // myfunc2 gives the integral function of myfunc double s=0.0; for (int j=0;j<m; j++) s+=a[j]*cos(b[j]*x)/b[j]; return -s; double ff3(double r) // This is the error in the gauleg algorithm for // numerical integration of myfunc ½

167 double a=0.0,b=r,c=0.0; Vec_DP x(npoint),w(npoint); NR::gauleg(a,b,x,w); for (int i=0;i<npoint;i++) c+=(w[i]*myfunc(x[i])); return c - ( -myfunc2(a)+myfunc2(b)); int main() double xx=0.0, zz; Vec_DP x(npoint),w(npoint); // Generate random coefficients for (int i=0;i<mterm;i++) a[i]=0.0; b[i]=0.0; M=(4<MTERM)? 4:MTERM ; // M must be smaller than MTERM init_srand(); for (int i =0;i<M;i++) // rdm is from matutl a[i]=rdm(0.2,3.0); b[i]=rdm(0.5,6.0) ; cout<<"\na = "; for (int i =0;i<M;i++) cout<<setw(14)<<a[i]; cout<<"\nb = "; for (int i =0;i<M;i++) cout<<setw(14)<<b[i]; NR::gauleg(X1,X3,x,w); for (int i=0;i<npoint;i++) cout<<"\nintegral from GAULEG: "<<xx<<endl; zz= -myfunc2(x1)+myfunc2(x3); cout<<"actual value: "<< zz<<endl; cout<<"error = "<< zz-xx<<endl; gnuplt1(myfunc2,"ff(x)",0, NULL); gnuplt1(ff3,"ff3(x)",0, NULL); return 0; // FILE: mygleg.cpp ends xx+=(w[i]*myfunc(x[i])); ½

168 ¾ «Üµ ½ ¼ ¹½ ¹¾ ¹ ¹ ¹¾ ¹½º ¹½ ¹¼º ¼ ¼º ½ ½º ¾ ¼ «Üµ ¹¹½ ¹½¹½ ¹½º¹½ ¹¾¹½ ¹¾º¹½ ¹ ¹½ ¹½ ¹¼º ¼ ¼º ½ ÐÑÔ ÙÚ ØØĐĐ ÒØÖÓØÚ ÙÒØÓØ ÐÑÔ ÐÓÖع ÑÒ NR::gauleg ÚÙÐÐ ØÔØÙÚÒ ÒÙÑÖ Ò ÒØÖÓÒÒÒ ÚÖ¹ ØØĐ ÝÐĐÖÒ ÙÒØÓÒ ÙÒ ÒØÖÓÒØ ØĐĐÒ ÝÐ ÚĐÐÒ ¼ Ü ÎÖ ÚÓÒ Ð Ó ÒØÖÓÒØ ÔÐÙØÙÙ ØÖÓÒÓÑØÖ Ò ÙÒØÓÒº ½

169 5 FUNKTIOIDEN APPROKSIMOINTI à ÖÐ Ø ÑÙØØ ÑØÑØØ Ø ÒØØ ØĐ ÙÒØÓÒ Ð ¹ ÙØÔ ÚÓÚØ ÒÙÑÖ ÐØ ÓÑÒ ÙÙ ÐØÒ ÓÐÐ ØĐÝ Ò ÖÐ ÔÝĐÓÖ ØÝ ÚÖÒ ÚÙØÙ ÔĐ ØÐØ ÑÒØÐÑĐصº ÌÙÒÒØÙÒ ÑØÑØØ Ò ÒØØØÒ ÒÓÐÐ Ó Üµ Õ ½ Ò ¾ ܵ ÓÚØ ¹ ÑÓ ÙÒ Ü ¾ ¼ ¾µ ÑÙØØ ÓÐ ØØ ØĐ ØØĐ ØØÓÓÒع Ð ØØ ÒÐÐ Ø Ò ØĐ ÑĐÐÐÒ ÑØ ÖÚÓغ Î ØÙ ¹ ØÓÒÒĐĐÓ Ø ÒØÝÝ ÔÝĐÓÖ ØÝ ÚÖÒ ÙÙÖÙÙ ÐÙÓ ÓÐÚ ÖÓ ÙØÒ ÓÐÑÑ ÄÙÚÙ ½ ÒĐÒغ ÙÒØÓÒ ÖÚÓÒ Ð Ñ Ò ĐÝØØĐĐÒ Ù Ø ÖÐ Ô¹ ÔÖÓ ÑÓÒØ Ó Ø ÆÊ ØØĐĐ Ø Ù Ò ÄÙÚÙ º ÌÙØØÙ Ìݹ ÐÓÖÒ Ö ÓÒ ÝÐÒ Đ ÒÙÑÖ Ò ØÖÓØÙ Ò ÙÓÒÓº ÂÓ ÌÝÐÓÖÒ Ö Ø ĐÝØØĐĐÒ Ô Ò ÑÑĐ ØĐ ØÖÑĐ ÙÒØÓÒ ÜÔ Üµ ÖÚÓÒ Ð Ñ Ò Ô Ø Đ Ü ÓÚØ ØÙÐÓ Ø ÙÖØ Ó Ô ½¼ ÈÖÑÔ ÚØÓØÓ ÓÚØ ÑÖ ÑÙÙØ ÔÓÐÝÒÓѹ ÖØÓ¹ ÒÐÙÒØÓØÐÑĐØ Ý ÚÒ ÈÒ ÑÒØÐÑĐغ ÌÖÓÒÓÑØÖ ØÒ ÙÒØÓÒ ÖÚÓ Ð ØØ ÚÓÒ Ñ¹ ÒØÐÐĐ ÙÖÚ Øº Ò Ò ÓØÒ ÓÐÐÒ ÚĐÐÐÐĐ Ñº ½ ½ ÔĐØÚĐ ÔÔÖÓ ÑØÓ ÓÒ ÚÖÐÐ ØØĐĐÒ ÖÚÓº ËÒĐÐÒ ÔÐÙØØÒ ÝÐÒÒ ØÔÙ ÑÙÙÒÒÓ ÚÓÒ ÚÙÐÐ ØĐĐÒ ØÔÙ¹ Òº ÈÓÐÝÒÓÑÒ ÖÚÓÒ ÑĐĐÖØÝ ØĐ ÔĐ ØĐ ÒĐÒ p=c[1]+c[2]*x+c[3]*pow(x,2)+c[4]*pow(x,3)+c[5]*pow(x,4); ÚÒ Ò º ÀÓÖÒÖÒ ÚÒ ÑÙ Ø p=c[n]; for (j=1;j <= n-1;j++) p=p*x+c[n-j]; ÅÝĐÓ ÔÓÐÝÒÓÑÒ ÖÚØØ ÚÓÒ Ð ÑÒ ØÔÒº ÇÐÑÑ ØÓ Ø ØÖ ØÐÐØ ÖÐ Ò ÐÙÙÐÙÒ ÑØÖ¹ ÚØÓÖØ Òº Î ØÚØ ØÖ ØÐÙØ ÚÓÒ ÙÐÓØØ ÑÝĐÓ ½

170 ÓÑÔÐ Ò ØÔÙ Ò ØÖ ØÐÑÐÐ ÒĐØĐ ÖÐÐÙÙÒ Ô¹ ÖÒº ÃÓ ¹Ð ØÙ ÓÑÔÐ ÐÙÙÒ ĐÝØØĐÓĐ ØÙµ ÓÒ ĐÝØØĐĐÒ ÑÔÐÑÒØÓØÚ ÓÑÔÐ ÐÙÙÒ ÖØÑØØ Ø ÓÔ¹ ÖØÓØ ÙØÒ ÝØÒÐ Ù ÖØÓÑÒÒ ÙÙÖÒÓØØÓ Òº ÆÊ ØØĐĐ ÚÙÐÐ ¹¼ ÓÑÔÐ ÐÙÙÒ ÖØÑØØ Ò ÓÔÖØÓÒ Ó¹ ÚÐØÙÚ ÐÓÖØÑ ¹Ð Đº ËÙÖÚ ¹ÓÐÑ ÚÐÓØØ Ð¹ ÓÖØÑÒ ĐÝØØĐÓĐ ÒØ ÖÚÓÒ ÆÊÒ ÓÑÔÐ Ð ÙØÓÑØÙ ØÒ ØÖÙ٠غ ÈÐÙØÑÑ ÑÐÒ ÐÙÚÙ Ø ½ ØØĐ ÝÔÖÓÑØÖÒÒ Ö ÑĐĐÖØÐÐĐĐÒ ÚÐÐ ¾ ½ Þµ ½ Ò¼ Òµ Òµ Þ Ò ÒµÒ Ñ Đ ¼µ ½ Ò ½µ Òµ Òµ ÃÖÑÑ ØØĐĐ ¹ ÚÙÐÐ ¾¾¹¾ ÐÓÖØÑÒ ÙÒØÓÒ Ð Ñ º ËÙÖÚ ÓÐÑ Ó ÓØØ Ó ÒØØØÒ ¾ Ô µ ¾µ ½¾ ½¾ ½ µ Ñ Đ ¾ µ Ô ½ ¾ Ò ¾ // FILE: myhypser2.cpp begins #include <iostream> #include <iomanip> #include <cmath> #include <complex> #include "nr.h" using namespace std; // Driver for routine hypser DP ff2(dp x) DP xx= x, y=nr::ellf(0.5*m_pi,xx); return y; int main() int p; DP x,r,s,kk; ¼ ½

171 complex<dp> a(0.5,0.0),b(0.5,0.0),c(1.0,0.0); complex<dp> z,series,deriv; cout<<" a= 1/2, b=1/2, c =1 \n"; cout<<" k F(a,b;c;k) (2/PI)*F(PI/2,sqrt(k)) Error\n"; for (p=1;p<=9; p++) x=((dp)p)*0.1; z=complex<dp>(x,0.0); NR::hypser(a,b,c,z,series,deriv); r=series.real(); s=series.imag(); kk=(2/m_pi)*((ff2(pow(x, 0.5)))); cout<<setw(7)<<x<<setw(14)<<series.real(); cout<<setw(20)<<kk<<setw(20)<<fabs(r-kk)<<endl; cout<<"this seems to show that F(PI/2,sqrt(k))=(PI/2) F(1/2,1/2,1,k)\n"; cout<<"which holds by AS, \n"; return 0; // FILE: myhypser2.cpp ends a= 1/2, b=1/2, c =1 k F(a,b;c;k) (2/PI)*F(PI/2,sqrt(k)) Error e e e e e e e e-16 This seems to show that F(PI/2,sqrt(k))=(PI/2) F(1/2,1/2,1,k) which holds by AS, Chebyshevin approksimointi ØØØ Ò ÓÐÚ Ý ÚÒ ÔÓÐÝÒÓÑ Ì Ò Üµ ÑĐĐÖØÐÐĐĐÒ ¹ ÚÐÐ Ì Ò Üµ Ó Ò Ö Ó Üµµ Ü ¾ ½ ½ ½¼

172 ËÐÐÓÒ Ì ¼ ܵ ½ Ì ½ ܵ Ü Ì ¾ ܵ ¾Ü ¾ Ì Ò ½ ܵ ¾ÜÌ Ò Üµ Ì Ò ½ ܵ Ò ½ Ý ÚÒ ÔÓÐÝÒÓÑØ ÓÚØ ÓÖØÓÓÒÐ ½ Ì Ô ÜµÌ Üµ ¼ ¾ ¼ ½ ½ Ü ¾ ¼ ÔÔÖÓ ÑÓÒØ Ý ÚÒ ÔÓÐÝÒÓÑÐÐ ÔÖÙ ØÙÙ ÙÖÚÒ ÐÙ Òº Lause. ÇÐÓÓÒ ÚĐÐÐÐĐ ½ ½ ÑĐĐÖØÐØÝ ØÙÚ ÙÒØÓ Ö¹ ØÓÑØ ¼ ½ ¾ Æ ½ ÑĐĐÖØÐØÝ ÙÖÚ Ø ËÐÐÓÒ Ú ¾ Æ Æ Ü µì Ü µ ½ ܵ Ü Ó Æ ¾ Æ ½ Ì Üµ ¼ ÔĐØ ÝØĐÐĐÓÒĐ Ì Æ ÜµÒ ÒÓÐÐÓ Ü ½ ¾ Æ ÖĐ Ý ÚÒ ÔÓÐÝÒÓÑÒ ØÙ ÓÒ ÖØÓÑÒ ÒÓÔ ÔÒ¹ ÒÑÒÒº ÂÓ ÝÓº ÔÔÖÓ ÑØÓÒ Ñ Ø ĐÝØØĐĐÒÒ Ó Ùѹ Ñ Ó ÝÐĐÖÒ ÓÒ Ñ Æ ÒÒ ÑÙÓÓ ØÙÚ ÖÓ ÓÒ ÒÒØĐĐÒ È ÆÑ ½ Ó Ì Ò Üµ ½ ËÙÖÚ ÓÐÑ ÒØ ÑÖÒ Ý ÚÒ ÔÔÖÓ Ñ¹ ØÓÒ ĐÝØĐÓ ØĐº ÑÖÙÒØÓÒ ÓÒ ÑÒÐØÒÒ ÙÒØÓ ÙÒ ÄÙÚÙÒ ÐÓÔÙ ØÖ ØÐÐÙ ÑÖ Đº ÇÐÑ ÒÖÓ Ø ¹ ØÙÒØÓÐÐ Ý ÚÒ ÔÔÖÓ ÑØÓÒ ÔÖØĐĐ ÙÚÒ ÐÙ¹ ÔÖĐ ØĐ ÙÒØÓ Ø ÔÔÖÓ ÑØÓ Øº ¼ ½ ½ µ ¾ /* FILE: mychebft.cpp begin */ // Plots a function and its Chebyshev approximation /* Modified from driver for routine chebft */ #include <cstdlib> // Used in putmat2 ½½

173 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include "nr.h" #include "matutl02.h" #define PRINT 1 #include "gnuplt1.h" #define NVAL 40 #define PIO2 (0.5*M_PI) #define MTERM 15 Vec_DP ccoef(nval), acoef(mterm), bcoef(mterm); int M, mval; /* M is the number of sine terms */ double func(double x) /* myfunc gives the values of the sine sums */ float s=0.0; int j; for (j=1;j<=m; j++) s+=acoef[j]*sin(bcoef[j]*x); return s; double ff2(double xx) DP f= NR::chebev((-PIO2),PIO2,ccoef, mval, xx); return f; int main() double a=(-pio2),b=pio2,f, x; int i; init_srand(); M=5; /* Generate random coefficients; M<MVAL */ for (i=0;i<=m-1;i++) /* rdm is from matutl02.cpp */ acoef[i]=rdm(0.5,5.0); bcoef[i]=rdm(-0.5,5.0) ;; printf("\na = "); ½¾

174 for (i =0;i<=M-1;i++) printf(" %8.5f", acoef[i]);; printf("\nb = "); for (i =0;i<=M-1;i++) printf(" %8.5f", bcoef[i]);; Vec_DP c(nval); NR::chebft(a,b,c,func); for (i=0 ;i<=nval-1;i++) if (fabs(c[i]) > 1e-9) printf("\nc[ %2d] = %12.5e \n",i, c[i]); ccoef[i]=c[i]; cout<<"\nfunction depends on "<<2*M<<" parameters\n"; /* test result */ printf("\nhow many terms in Chebyshev evaluation?\n"); printf("enter n between 6 and %2d. (n=0 to end).\n",nval); scanf("%d",&mval); printf("you entered: %2d\n",mval); if ((mval<2) (mval>nval-1)) abort(); Vec_DP c2(mval); for (i=0 ;i<=mval-1;i++) c2[i]= ccoef[i]; printf("\n%9s %14s %16s\n","x","actual","Chebyshev fit"); for (i=-8;i<=8;i++) x=i*pio2/10.0; f=nr::chebev(a,b,c2,mval,x); printf("%12.6f %12.6f %12.6f \n",x,func(x),f); gnuplt1(func,"func(x)",0,ff2,"ff2(x)",2,null); return 0; /* FILE: mychebft.cpp end */ a = b = c[ 1] = e+00 c[ 3] = e+00 c[ 5] = e+00 c[ 7] = e+00 c[ 9] = e-01 c[ 11] = e-02 c[ 13] = e-03 c[ 15] = e-04 c[ 17] = e-05 c[ 19] = e-07 c[ 21] = e-08 ½

175 ... c[ 37] = e-08 c[ 39] = e-09 Function depends on 10 parameters How many terms in Chebyshev evaluation? Enter n between 6 and 40. (n=0 to end). 8 You entered: 8 x actual Chebyshev fit ¾ ¼ ¹¾ ÙÒ Üµ «¾ ܵ ¹ ¼ ¼º¾ ¼º ¼º ¼º ½ Padén approksimointi ØØØ Æ ÓÐÚ ÖØÓÒÐÙÒØÓ ÓÒ ÐÙ Ê Üµ Ô Üµ Õ Üµ Ñ Đ Ô Õ ÓÚØ ÔÓÐÝÒÓÑ ÓÒ ØÐÙÙÒ ÙÑÑ Æ Ö¹ Ó ØÔÙ Ò Õ Üµ ½ Ò ÔÓÐÝÒÓÑغ ÆĐÒÓÐÐÒ ÓÒ ÐÚĐĐ ½

176 ØØĐ ØØØ Æ ÓÐÚÐÐ ÖØÓÒÐÙÒØÓÔÔÖÓ ÑÓÒÒÐÐ ÚÙع ØÒ ÙÙÖÑÔ ØÖÙÙ ÙÒ Ñ ØØØ ÓÐÚÐÐ ÔÓÐÝÒÓÑÔ¹ ÔÖÓ ÑØÓÐк Ä ĐØÙÒ ÖØÓÒÐÙÒØÓÐÐ ÓÒ ØØĐ ÒØĐ ÚÓ¹ Ò ĐÝØØĐĐ ÑÝĐÓ ÔÔÖÓ ÑÓØ ÙÒØÓØ ÓÐÐ ÓÒ ÒÙ¹ ÐÖØØØ Ð ĐĐÖØØĐÓÑÝÝ Ô Øµ ÐĐÐÐĐ ÔÔÖÓ ÑÓÒØÚĐÐĐ ÑÙØØ ÙØÒÒ ÚĐÐÒ ÙÐÓÔÙÓÐÐк ÄĐØĐÓÓØÒ ÔÔÖÓ ÑØÓÐÐ ÓÚØ ÚØÑÙ Ø Üµ ½ Ü ¼ Ê ¼µ ¼µ µ ܵ Ü µ È Å¼ Ü Ô Üµ ½ ÈÆ Ê Üµ ½ Ü Õ Üµ µ Ê Üµ Ü µ ½ Å Æ Ü¼ ÄÚÒØÑÐÐ ÐÐÒÒ ÝØĐÐĐÓ ÖØÓÑÐÐ ÔÙÓÐØØÒ ÓÒÔÙÓÐÒ ÒÑØØĐĐÐÐĐ ÖØĐÑĐÐÐĐ ÓÔÚ Ø ØÖÑĐ ÑÑ ÐÙ Ò ÜµÕ Üµ Ô Üµ ÎØÑÐÐ ØØĐ ÐÙ Ò ÖØÐÑĐ ØĐ ĐÚĐÚĐØ ¹ ØØØ Å Æ ÓÐÚØ ØÖÑØ Ò ÖÙÖ ÚÒÒ ØÓ ÖØÓ¹ ÑÒ ÑĐĐÖØÝ Ðк ÅÙÓÓ ØÙÚ ÐÒÖÒÒ ÝØĐÐĐÓÖÝÑĐ ÚÓÒ ÖØ Ø ÄÙÚÙÒ ¾ ÑÒØÐÑÒº ȹÔÔÖÓ ÑÓÒØ ÓÒ ÅÄÙÖÒ¹ ØÐÑĐÒ ÝÐ ØÝ º ÐÓÖØÑ NR::pade º ¾¼¾µ ÒØ È¹ÔÔÖÓ ÑÓÒÒÒ Ó Å Æ // FILE: mypade.cpp begins // This program computes Pade approximation for // 2^x in terms of p(x)/q(x) where both p and q // are polynomials of degree n. #include <iostream> #include <iomanip> #include <cmath> #include "nr.h" using namespace std; ½

177 int main(void) int j,k,n; DP resid,b,d,fac,x; for (;;) cout << "Enter n for PADE routine (or 0 to stop): "; cin >> n; cout << endl; if (n < 1) break; Vec_DP c(2*n+1),cc(2*n+1); fac=1; for (j=0;j<2*n+1;j++) c[j]=1.0/fac; cc[j]=c[j]; fac =(fac/log(2.0))*((double)j+1.0); NR::pade(c,resid); cout << "Norm of residual vector= " << scientific; cout << setw(8) << resid << endl; cout << setw(14) << "point" << setw(19) << "func. value"; cout << setw(16) << "pade series" << setw(16) << "power series"; cout << setw(16) << "pade-func" << endl; cout << fixed << setprecision(8); for (j=0;j<21;j++) x=j*0.25; for (b=0.0,k=2*n;k>=0;k--) b *= x; b += cc[k]; d=nr::ratval(x,c,n,n); cout << setw(8) << x << setw(12) << pow(2.0,x); cout << setw(16) << d << setw(16) << b; cout << setw(15) << pow(2.0,x)-d << endl; cout << endl; return 0; // FILE: mypade.cpp ends Enter n for PADE routine (or 0 to stop): 6 Norm of residual vector= e-17 ½

178 point func. value pade series power series pade-func e e e e e e e e e e e e e e-07 3e-08 PadeError(x) 2.5e-08 2e e-08 1e-08 5e ȹÔÔÖÓ ÑÓÒØ ÓÒ ÝÓº ÑÖ Đ ÝÐÐĐØØĐÚĐÒ ØÖº ¹ Ý ÚÒ ÔÔÖÓ ÑÓÒÒ Ò Ò ÓÐÐÒ ÚĐÐÐÐĐ ÝÚĐ ØÖÙÙ ÙÒ Ø È¹ÔÔÖÓ ÑÓÒÒ ØÖÙÙ ÐÙ Ø ÚÓ¹ ÒÓ ÙÙÖ ÑØĐĐÒº ½

179 6 ERIKOISFUNKTIOT Í Ò ÒØÝÚĐĐ Ø ÑÙÙØÒ ÝĐÓÝÐÐ ØĐ ÙÒØÓØ ÒÓØÒ ÖÓ ¹ ÙÒØÓ º ÆĐÒ ÙÒØÓÒ ÑÖØÝ ÖØÝ ÝÝ ÓÒ ÒĐ ØØĐ Ò ÑÓÐÐ ØÚØ ÑÓÒ ÓÚÐÐÙ ÒØÝÚÒ ĐĐÖÖÚÓØØĐÚÒ ÖØ Ñ Ò ÒÐÝÝØØ ÑÙÓÓ º ËÙÙÖ Ó ÖÓ ÙÒØÓ ¹ Ø ØÓØÙØØ ÓÒÒ ØÓ Ò ÖØÐÙÚÙÒ «ÖÒØÐÝØĐÐĐÓÒº Åع ÑØØÒÒ Ý ÓÑÒØÓÖ ÓÚØ ØØÒÐÓ Ó Ö¹ Ó ÙÒØÓØ ØÚÒØ ĐÝØØĐĐÒº ÌÓ ÒÒ ÖÓ ÙÒØÓØ ØÒ Ò º Ð ÙÒØÓÒ ÓÖ¹ ÑÔÒ ØÖÒ ÒÒØØÙÒØÓÒº ÑÖĐ Ð ÙÒØÓ Ø ÓÚØ ÔÓÐÝÒÓÑØ ØÖÓÒÓÑØÖ Ø ÙÒØÓØ ÝÔÖÓÐ Ø ÙÒØÓØ ÔÓÒÒØØÙÒØÓØ Đ ÒĐÒ ĐĐÒØ ÙÒØÓغ ÃÓÖÑÔÒ ØÖÒ ÒÒØØÙÒØÓÒ ÙÙÐÙÚØ ÙÐÖÒ ¹ÙÒ¹ ØÓ Ù Ø ØÓÒÒĐĐÓ ÝÝ Ð ÒÒÒ ÙÒØÓØ ÐÒ ÙÒØÓØ Ð¹ ÐÔØ Ø ÒØÖÐØ ÐÐÔØ Ø ÙÒØÓØ Đ Ù Ò ÝÔÖÓÑع ÖÒÒ ÙÒØÓº ÖÓ ÙÒØÓÒ ÑĐĐÖØØÐÝÐÙ ÓÒ ØÚÐÐ Ø Ó¹ Ò ÓÑÔÐ Ø ÓÒ Ó ¹ÐÙº ÇÐÑÖ ØÓØ ØÖÓÚØ ÚØй ÚÒ ÓÓÐÑÒ ÐÓÖØÑ ÖÓ ÙÒØÓÐÐ ÚØÐÙ ÒØÝÝ Ö¹ ØÝ Ø ÐÓÖØÑÒ ÔĐØÚÝÝ ÐÙÒ ÚÖÖÓÒ ÙØÒº ÃÒ ÒÚĐÐ Ø ÑÖØØĐÚÑÔĐ ÔÖÙ ØÓ ÖÓ ÙÒØÓÒ ÐÐÐ ÓÒ Ë Ó ÓÒ ÑÝĐÓ ÖØØĐÒ ÝĐÓÝÐÐÒÒ ÙØÓ ÒÙÑÖ¹ Ò ÐÐк Ë ÐÒ ÒØÒ ØÖØØÙ ÑØÑØÒ Đ ÖÓº 6.1. Gamma-funktio. ¹ÙÒØÓÐÐ ÓÒ Ù Ø ÚÚÐÒØØ Øݹ Đº ÌÚÐÐ Ò ÒĐ ØĐ ÓÒ ÙÐÖÒ ÒØÖÐ Þµ ½ Ø Þ ½ Ø Ø ÊÞ ¼ ¼ ÙÒØÓÒ ÑĐĐÖØØÐÝÐÙØØ ÚÓÒ ÐÒØ ĐÝØØĐÒ ØÖØÚ¹ Ø Ú Þ ½µ Þ Þµ ÃÚÒ ÚÙÐÐ ÑÑÙÒØÓÒ ÑĐĐÖØØÐÝÓÙÓ ÚÓÒ ÐÒØ ÓÙÓ Ò¼ ½ ¾ ÈÓÙ Ô Ø Đ ÙÒØÓÐÐ ÓÒ ÒÔ Ð ½

180 ĐĐÖØØĐÓÑÝÝ Ô Ø Ø Ó ÐÑÔÒ ÓÐÚ ÙÚ Ê Þµ غ ÖĐØĐ ÔÖÙ ÓÑÒ ÙÙ ÓÒ ØØĐ Þµ ÓÒ ÖØÓÑÙÒØÓÒ ÝÐ ØÝ ËÐÐÓÒ ÔĐØ ØÐÑĐ Ò ½µ Ò Ò ½ ¾ ½µ ¾µ ½ Þ ½µ Þ ½ ¾ µþ ½¾ Þ ½¾ µô ¾ ¼ ½ Þ ½ Æ Þ Æ ÀÙÓÑÓÒ ÝÓº ÑÓÒÑÙØ Ò ÑĐĐÖØÐÑĐÒ ÓÒ ÙÖÚ ØØÓ Ñй Ó ÝÐÐĐØØĐÚĐ ÒÑØØĐÒ ØØĐ Ó Æ ÒÒ ÓÒ ÓÐÑ ÓÔÚØ ÚÓØ ¼ ÓÐÐ ÚÖØÖÑÐÐ ÔĐØ ¾ ½¼ ½¼ ÐÙ Ê Þ ¼µº ÆÊ ØÖÓ ÐÓÖØÑ ÙÖÚÐÐ ÙÒØÓÐÐ ÓØ ÓÚØ ÐĐ Đ ÝØÝ Đ ¹ÙÒØÓÓÒ NR::gammln(x), x > 0 Ð ÐÓ ÜµÒ ÖÚÓ NR::factrl(n) Ð ÒÒ ÖÚÓ Æ NR::bico(N,K) Ð Ò ÖÚÓ Ã NR::beta(p,q) Ð Ô Õµ Ôµ Õµ Ô Õµ Ò ÖÚÓº // FILE: mybico2.cpp begins // Driver for routine bico #include <cmath> #define SCALE 1 #define PRINT 1 #include "nr.h" #include "gnusurf.h" double f(double x,double y) ½

181 int n=(int)floor(x), p=(int)floor(y); if (n<=p) n=p+1; return NR::bico(n,p); int main() int k,n,sum; double xx[]=1.,6.,yy[]=1.,6.; cout<<"pascal triangle (and row sum):"<<endl; for (n=1;n<=8; n++) sum=0; for (k=0;k<=n;k++) sum+=(int)nr::bico(n,k); cout<<" "<<NR::bico(n,k) <<" "; if (k==n) cout << " ( "<<sum<<" )\n"; gnusurf(f,xx,yy,scale,0,"bico(x,y)","testi"); return 0; // FILE: mybico2.cpp ends Pascal triangle (and row sum): 1 1 ( 2 ) ( 4 ) ( 8 ) ( 16 ) ( 32 ) ( 64 ) ( 128 ) ( 256 ) ½¼

182 Re(Γ(x+i*y)) < y < < x < ½¼ ¾ ½ ½º ¾ ¾º º º º ½ Ø Ø ½¼ ½º¾ ¾º º º º ÆÊ Đ ÓÒ ÑÔÐÑÒØÓØÙ ÑѺ ÙÖÚ ÙÒØÓØ ÔĐØĐÝÐÐÒÒ ÑѹÙÒØÓ NR::gammp(A,X) ܵ È Üµ ½ µ Ü µ Ø Ø ½ Ø ¼µ ¼ ÎÖÙÒØÓ Ö Üµ Ð ÒÒÒ ÙÒØÓغ ÐÒ ÙÒØÓØ Â Þµ ½ È ¾ Þµ ½¼ ÙÚ ºº½»ÆÊ º¾ ½µº Ô ¾ Ê Ü¼ ؾ Ø ÑÙØ ØÓÒÒĐĐÓ ÝÝ ¹ ½ Þ ¾ µ ½µ ¾ Ê º ½½

183 // FILE: mybess.cpp begins // Bessel functions #include <fstream> #include <iostream> #include <iomanip> #include "nr.h" #define PRINT 1 #include "gnuplt1.h" using namespace std; double ff1(double x) return NR::bessj0(x); double ff2(double x) return NR::bessy0(x); double ff3(double x) return NR::bessj1(x); double ff4(double x) return NR::bessy1(x); // for positive x int main() int p; double x,a,b,c,d; cout<<" x J0(x) Y0(x) J1(x) Y1(x) \n"; for (p=1;p<=9; p++) x=((double)p)*1.0; a= NR::bessj0(x); b= NR::bessy0(x); c= NR::bessj1(x); d= NR::bessy1(x); cout<<setw(12)<<x<<setw(12)<<a<<setw(12)<<b; cout<<setw(12)<<c<<setw(12)<<d<<endl; ½¾

184 gnuplt1(ff1,"j0(x)",13,ff2,"y0(x)",13,ff3,"j1(x)",\ 13,ff4,"Y1(x)",13,NULL); return 0; // FILE: mybess.cpp ends ¼º ¼º ¼º ¼ ܵ ¼ ܵ ½ ܵ ½ ܵ ¼º¾ ¼ ¹¼º¾ ¹¼º ¹¼º ¹¼º ¼ ¾ ½¼ ½¾ ½ ½ ½ ¾¼ 6.2. Elliptiset integraalit. ÅÓÒØ ÑÒÒ ØĐØØØÒ ÓÒй ÑØ ÓØÚØ ½¼¼¹ ½¼¼¹ÐÙÚÙÐÐ ÒØÖÐÒ ÓØ ÚÓØ٠й Ñ Ø Ð ÙÒØÓÒ ÚÙÐк ÆĐÒ ÓÙØØÒ ÙÙ Ò ÙÒØÓÐÙÓ¹ Ò ÑѺ ÐÐÔØ Ò ÒØÖÐÒ ÓÒ Ñ ØØØÒ ÚÒØÙ ÓÐÐ ÐÐÒ ÓÒ ØĐÖĐ Ñ ĐĐÓÑÒØÒ ÒØØĐÐ Ù º ÅÓÒØ ÒĐ ØĐ ØÖÒ ÒÒØØÙÒØÓ Ø Ó ÓØØÙØÙÚØ ÒÒ ØÖÔй Ð ØØĐ ÒÒ ÖÚÓØ ØÙÐÙÓØÒ Đ ÖÓÒº ÆÙÓ ½¼¼¹ÐÙÚÙÐÐ ÚÙÓ Ù Ò Ð ÙØÝĐÓÒ ÚØÒØ ØÙÐÙÓØ ÚÓØ Ò ÒÝÝÒ Ð ¹ ÑÙÙØÑ ÙÒÒ º ÑÖĐ ÙÒØÓÐÙÓ Ø ÓØ ÒØÝÚĐØ Ù Ö ÝØݹ Đ ÓÚØ Ù Ò ÝÔÖÓÑØÖÒÒ ÙÒØÓ Đ ÐÐÔØ Ø Òع ÖÐØ ÐÐÔØ Ø ÙÒØÓغ ÅÒØØÓÓÒ ØØĐ ÑѺ ÐÙÖÒ ¹ ÐÙ Ò Ú ÚÓÒ ÐÑ Ø ÐÐÔØ ØÒ ÒØÖÐÒ ÚÙÐÐ ÑÓÒ ÐÐÔ Ò ÖÒ ÔØÙÙ º ÐÐÔØ ØÒ ÙÒØÓÒ ØÓÖÒ ÑÖ¹ ØØĐÚĐ ØØĐĐ ÓÐ ÄÒÖ ÓÒ ØÙØÑÙ Ø ÓØÚØ ÑѺ ĐÒÒ ÒÑĐĐÒ ÒØÚÒ ØÝ ÑÙÓØÓÒ ÐĐÓÝØÝÑ Òº ½

185 ÄÒÖÒ Ò º ÔĐØĐÝÐÐ Đ ÐÐÔØ Đ ÒØÖÐ ÓÚØ µ Õ ½ ¾ Ò ¾ ¼ ¼ Ô ½ ¾ Ý Ô ¾ Ý ½ Ý ¾ µ ¼ Õ ½ Ü ¼ ¾ Ò ¾ Ý ¼ Ü Õ ½ ܾ µ ½ ½ ¾ µü ¾ Ý Õ ½ ݾ µ ½ ¾ Ý ¾ µ Ý Ò Ü ØÒ ¼ ½ ¼ ¾ ÆÙÑÖ Ò ØÖ ØÐÙÒ ÓÚÐØÙÚØ ÐÐ Đ ÔÖÑÑÒ Ò º Öй ÓÒÒ ÝÑÑØÖ Ø ÒØÖÐØ Ê Ü Ý Þµ Ê Â Ü Ý Þ Ôµ Ê Ü Ý Þµ Ê Ü Ýµ ½¼¹ÐÙÚÙÐغ ÃÖÑÑ ØÓ ÔÒÓ ÓÒ ÖÐ ÓÒÒ ÐÓÖع ÑØ NR::rf, rj, rd, rc ÒĐÒ Ð Ñ º ÅÓÒØ ÓÐÑÖ¹ ØÓØ ĐÝØØĐÚĐØ ÙÙÖ ÒĐØĐ ÐÓÖØÑ ÑÝĐÓ ÐÐÔØ ØÒ ÒØÖ¹ ÐÒ Ð Ñ Òº ÌĐĐÒ ØÖÓØÙ Ò ØÖÚØÒ ÙÖÚØ ÔÐÙ¹ ØÙ ÚØ ÄÒÖÒ ÒØÖÐÐÐ µ Ò µnr::rf Ó ¾ ½ ¾ Ò ¾ ½µ µ Ò µnr::rf Ó ¾ ½ ¾ Ò ¾ ½µ ½ ¾ Ò µnr::rd Ó ¾ ½ ¾ Ò ¾ ½µ ÖØÝ Ò ØĐÖØĐ ÓÚØ ÄÒÖÒ Ò ÑÑĐ Ò ÖØÐÙÚÙÒ ØĐÝÐÐÒÒ ÐÐÔØÒÒ ÒØÖÐ Ã µ ¾ µ rf ¼ ½ ¾ ½µ ¾ ¼ ½µ ØÓ Ò ÖØÐÙÚÙÒ ØĐÝÐÐÒÒ ÒØÖÐ µ ¾ µ rf ¼ ½ ¾ ½µ ½ ¾ rd ¼ ½ ¾ ½µ ¾ ¼ ½ ½

186 Ù ½µ ÓÒ ØÓ ØÒÙØ ØØĐ Ã µ ÚÓÒ Ð ÐÙÙÒ ½ Ò º ÖØÑØØ ¹ÓÑØÖ Ò ÖÚÓÒ ½ µ ÚÙÐÐ ÙÖ¹ Ú Øº ØØÒ ¼ ½ ¼ Ò ½ ½ ¾ Ò Ò µ Ò ½ Õ Ò Ò Ò ¼ ½ ¾ ËÐÐÓÒ ÐÙÙÓÒÓÒ Ò µ Ò µ ÝØÒÒ Ö¹ÖÚÓ ½ µ ØÓ¹ ØÙØØ Ù Ò ÒØØØÒ µ à Խ ¾ µ ¾ ½ µ º º ÖÐ ÓÒÒ ØĐÓ Đ ½¼¹ÐÙÚÙÐÐ ÓÒ Ù Ò ÒØØØÒ ÝÐ ¹ ØÝ Đº ÖÐ ÓÒÒ ÐÓÖØÑØ ÓÒ ÓØØØÙ ÐÐÔØ ØÒ ÒØÖÐÒ ÒÙ¹ ÑÖ Ò Ð Ñ Ò ÔÖÙ Ø Ù ÓÐÑÖ ØÓ ÙØÒ Æ ÁÅËÄ ËÄ̺ ËÙÖÚ Ø ÓÐÑ Ø ÐÑÒ ÑØÒ Ñº ÙÒØÓØ ĐÝØØĐĐÒº ÌÙÐÓ ØÒ ÓÐÐ ÙÙÒ ØÖ ØÑ ÓÐÑ ØÙÐÓ ØØÒ Ú¹ Ñ Đ Ö Ø Ø ÙÙÖ µã ¼ µ ¼ µã µ à ¼ µã µ ¾ ¼ Ô ½ ¾ Ó ÓÒ ÒØØ Ø ÒÓÐÐ ÄÒÖÒ ÒØØØÒ ÔÖÙ ØÐк // FILE: myrf.cpp begins // This program computes the values of the complete elliptic // integrals K(k) and E(k). To check the correctness of // the result, a test quantity is printed (it should vanish by // Legendre s identity) #include <cstdlib> #include <cstdio> #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> using namespace std; #include "nr.h" #define PRINT 1 #include "gnuplt1.h" ½

187 double ff1(double x) return NR::elle(0.5*M_PI,x); double ff2(double x) return NR::ellf(0.5*M_PI,x); double LegId(double &x) // Legendre s identity says that // E K +E K -K K - pi/2 = 0 if (abs(x)>1-1e-10) x=(x/abs(x))*(1-1e-11); double E=ff1(x), E1=ff1(pow(1-x*x, 0.5)), K=ff2(x), K1=ff2(pow(1-x*x, 0.5)); return E*K1+E1*K-K*K1-0.5*M_PI; int main() int p; double x,r1,r2; cout<<" k E(k) K(k) "; cout<<" Legendre(k) \n"; for (p=1;p<=9; p++) x=p*0.1; r1=nr::ellf(0.5*m_pi,x); r2=legid(x); cout<<setw(6)<<x<<setw(12)<<nr::elle(m_pi/2,x); cout<<setw(12)<<r1<<setw(16)<<r2<<endl; gnuplt1(ff1,"e(k)",0,ff2,"k(k)",0,null); return 0; // FILE: myrf.cpp ends k E(k) K(k) Legendre(k) e e e e e e e e e-16 ½

188 ¾º ¾º µ à µ ¾º¾ ¾ ½º ½º ½º ½º¾ ½ ¼ ¼º½ ¼º¾ ¼º ¼º ¼º ¼º ¼º ¼º ¼º ½ ÖÓ ÙÒØÓÒ ÐÐØ ÓÒ Ð ÖÐÐ ÙÙ º ÖĐ ÖÚÓÚÐع ÒÒ ÐÒ ØØÐÝ ÓÒ ØÓ º ÒÖÛ Êº Ý Êº ÊÓÝ ËÔÐ ÙÒØÓÒ ÒÝÐÓÔ Ó ÅØÑØ Ò Ø ÔÔÐØÓÒ ÎÓк ½ ÑÖ Íº ÈÖ ½ ÁËÆ ¼¹¾½¹¹º ÖÓ ÙÒØÓ¹ Ò ÒÙÑÖ Ò Ð ÒØÒ ÙÙÒØÙØÙÒØ ÓÚØ ÙÖÚØ ØÓ Ø Ëº ĺ ÅÓ Ö ÅØÓ Ò ÈÖÓÖÑ ÓÖ ÓÑÔÙØÒ ÅØѹ ØÐ ÙÒØÓÒ ÈÖÒØ ÀÐÐ ½ Ϻ º ÌÓÑÔ ÓÒ ØÐ ÓÖ ÓÑÔÙØÒ ÅØÑØÐ ÙÒØÓÒ Âº ÏÐÝ ² ËÓÒ ½ ÁËÆ ¼¹½¹¼¼¾¼¹º º ÄÓÞÖ º ÇÐÚÖ ÓÚØ ØÒØ ÐÒ Ø Ù Ò ÖÓ ÙÒØÓÒ ÒÙÑÖ Ò ÐÓÖØÑÒ Ó ÐĐÓÝØÝÒ ÁÒØÖÒ¹ Ø ØĐ ÀÝĐÓÝÐÐ Đ ÐÒĐ ÓÒ ÑÝĐÓ Ëº ÒÒ ÓÓ ØÑÐÐ ÚÓÖØ Åع ÑØÐ ÓÒ ØÒØ ÛÛÛ¹ ÚÙÐÐ ½

189 7 SATUNNAISLUVUISTA ÌØÓÓÒÐÐ ÚÓÒ ÒÖÓ Ò º Ô ÙÓ ØÙÒÒ ÐÙÙ ÓØ ØÓ ÑÒ ÔĐØÖ Ø ÙØ ÙÑÑ ØÙÒÒ ÐÙÚÙ º Ç Ø ØÙÒÒ ÐÙÚÙ Ø Ò ÖÓÚØ ĐÐ ØØĐ Ò ÓÚØ ØĐÝ Ò ØÖÑÒ¹ Ø ØÙÓØØØÙ ÓÐÐÒ ØÙÒÒ ÐÙÙÒÖØØÓÖÐк ÆÒ ØÐ ¹ ØÓÐÐ Ø ÓÑÒ ÙÙØ ÒÓÙØØÚØ ÓØÒ ØÙĐØÒ ÒÒØØÙ ØÓ¹ ÒÒĐĐÓ ÝÝ ÙÑ Ø ØĐÑĐ ÒÒ ÓÒ ØÚÓØØÒº ËØÙÒÒ ¹ ÐÙÙÒÖØØÓÖÒ ÐØÙÖØÖØĐ ØÓÙÙ ÑØÒ ÝÚÒ ÒÖÓØÙÒ ÐÙÙÒ ÙÑ Ú Ø ØÚÓØØÒ ÓÐÚ ÙѺ ËØÙÒÒ ÐÙÙÒ ÚÙÐÐ ÚÓÑÑ ØÙÓØØ Ù ØÚ ÒĐÝØØØĐ ÓÒ¹ Ò Ý ØÑÒ ÝĐÓØÚÖÙ٠غ ËÐÐ Ø ÑÒØØÐÝĐ Ó ØĐÐÐ ÓÐÙ Ý ØÑØØ Ø ØÙÓØØÒ Ó ØÙÐÓ Ò ÔÓÐØ ØĐĐÒ ÓØÓÔĐĐØĐÓ Đ ØÖ ØÐØÚ Ø ÐÑĐÓ ØĐ ÙØ ÙØÒ ÑÙÐÓÒÒ º ËÑÙÐÓÒØ ĐÝØØĐĐÒ ÖØÝ Ø ÐÐÓÒ ÙÒ ÐÑĐÓ ÓÒ ÒÒ ÑÓÒ¹ ÑÙØÒÒ ØØ ØĐ ÔÝ ØÝØĐ ØÓÚÓØÙÐÐ ØÖÙÙÐÐ ÙÚÑÒ ÑØÑØØ ÐÐ ÑÐÐÐк ËÑÙÐÓÒØ ĐÝØØĐĐÒ ÑÝĐÓ Ó ÐÙØÒ ØĐ ÒÙÑÖ ÓØ Ý ØÑ ØĐ ÓØ ØÓÐÐ ÙÙ ÚÓ¹ ØÓØÙØØ Ñº ÐÐÒ Ù ØÒÒÙ ØÒ ÚÙÓ º ÃÓÒÖØØ Ò ÑÖÒĐ ÚÓÒ ÑÒØ ÔÙÐÒÚÖÓÐÒØÒ ÑÙÐÓÒغ Ź ÐÒÒÒÓÒ ÓØÒ ÚÓ ÐÐÓÒ ØÓ ÐØ ÓÐÐ ÔÐÚÐÙÒ Ô ØØÒ ÔÖÑØÖÒ ØÖÐÙ ØÓ ÐØ Ý ØÑÒ ÑØÓØÙ Ò ÐØØÝÚĐØ ÔÖÑØÖغ ÄÙÚÙ ½ ØÑÑ ÑÙÙØÑ ÔÒĐ ÑÙÐÓÒØÓÐÑ ÑѺ ÒÓÔÒØÓÒ ÑÙÐÓÒØÒº ËØÙÒÒ ÐÙÚÙØ ÒÖÓØÒ ÐÐĐ ¹ÐÒ ØÒÖÖ ØÓÓÒ ÙÙÐÙÚÒ ØÙÒÒ ÐÙÙÒÖØØÓÖÒ ÚÙÐк ÆÊ ØØĐĐ ÖØĐ ØÙÒÒ ÐÙÙÒÖØØÓÖ Ø ÐÙØØÐ ÓØÒ ÔÖÙ ØÐÐ Ø Ø ØØØÙ ÒÖØØÓÖغ Ð ØÓØÑÙ Ò ÚÓ ÒÓ ØØĐ ÒÖØØÓÖÒ ÐØÙ ÚØÐ ÑÖØØĐÚĐ Øº ÒÖØØÓÖØ ØØĐĐÒ ÐÐÒ ÚРغ ÁÑÔÐÑÒØØÓØ ÖÔÔÙÚØ ÓÐÑÓÒØÐ ØĐ ĐĐÒØĐĐ ØĐº ½

190 Í Ø ÒÖØØÓÖØ ØÙÓØØÚØ ÓÐÐ Ò ÐÙÙÓÒÓÒ Ó ÚÓ ÓÐÐ ÔØĐÒµº ÑÖÒĐ ÙÙ Ø Ð ÙÓÑÓØ Ò Ø ÒÖØØÓÖ Ø º ÅÖ ÒÒ ØÛ ØÖ ÌÓÒÒĐĐÓ ÝÝ Ð ÒÒÒ ÔÖÙ ØÙÐÓ ØÒ ÒÓÐÐ ØÙÒÒ ÑÙÙع ØÙÒ ÙÒØÓÒ ÙÑ ÚÓÒ ÔÐÙØØ ÐÙÔÖĐ Ò ÙÑÒ ÑÙÙØØÙÒÚØÓÚÒ ÚÙÐк ÌĐÑĐÒ ÚÙÓ Ø Ø ÙÑ ¹ Ø ÚÓÒ ÒÖÓ ÓÔÚÒ ÑÙÙÒÒÓ Ò ÚÙÐÐ ĐÝØĐÒÒĐÓ Đ ØÖÚØØÚØ ÙÑغ à º ÖØÝ Ø º ź ÄÛ ¹ Ϻ º ÃÐØÓÒ Ë¹ ÑÙÐØÓÒ ÑÓÐÒ Ò ÒÐÝ ÅÖÛ ÀÐÐ ¾¼¼¼ ÁËÆ ¼¹¼¹ ¼¾¾¹ ÄÙÙ º Lause. ÇÐÓÓØ ØÙÚ ØÙÒÒ ÑÙÙØØÙ ØÝ ÙÒØÓÒ Ü Ýµ Đ À Ê ¾ Ê ÙÒØÓØ Í µ Î À µ ØÙÒÒ ÑÙÙØØÙº ÇÐØØÒ ØØĐ ÝØĐÐĐÓÖÝÑĐ ØĐ Ü Ýµ Ù À Ü Ýµ Ú ÚÓÒ Ü Ý ÖØ Ø Ý Đ ØØ Ø ÙÒ ÚÒ ÙÒØÓÒ ØØĐ ÓÙÓ Ó Ü Ýµ ¼ ÔĐØ Àµ Ü Ýµ Ü À Ý À Ý Ü ¼ ËÐÐÓÒ ØÙÒÒ ÑÙÙØØÙÒ Í Î ÝØ ÙÑÒ ØÝ ÙÒØÓ ÓÒ Àµ ÍÎ Ù Úµ Ü Ýµ Ü Ýµ ½ Ñ Đ Ü Ýµ ÓÒ Ñº ÝØĐÐĐÓÖÝÑĐÒ ÖØ Ùº Boxin-Müllerin muunnos. ÇÐÓÓØ Ü ½ Ü ¾ ÖÔÔÙÑØØÓÑ ØÙÒÒ ¹ ÑÙÙØØÙ ÓØ ÒÓÙØØÚØ ÚĐÐÒ ¼ ½ Ø Ø ÙѺ ËÐÐÓÒ ÑÙÙØØÙØ Þ ½ Þ ¾ Þ ½ Õ ¾ ÐÓ Ü ½ Ó ¾Ü ¾ µ Þ ¾ Õ ¾ ÐÓ Ü ½ Ò ¾Ü ¾ µ ½

191 ÓÚØ ÖÔÔÙÑØØÓÑ Æ ¼ ½µ¹ÒÓÖÑÐÙØÙÒØ ØÙÒÒ ÑÙÙع ØÙºÌĐÑĐ ÙÖ ÐÐ ØĐ ÚÐÒÒÐÐ Í Þ ½ Î Þ ¾ ÆÊÒ ÓÐÑNR::gasdev ÔÖÙ ØÙÙ ÓÜÒ¹ÅĐÙÐÐÖÒ ÑÒØÐÑĐĐÒº ÑÓ¹ÓÐÑ xgavdev.cpp ØÙÓØØ ÙÖÚÒ ÒÓÖÑÐÙØÙ¹ ÑÒ ÔÖÓ ÐÒº x p(x) graph: **** ******* ******** *********** **************** ******************* *********************** ************************** ****************************** ***************************** ******************************* ******************************* ****************************** *************************** ********************** ******************* *************** *********** ******** ****** **** ËÙÖÚ ÓÐÑ ÓÒ xran.cpp»æê ÑÒ ÑÙÓØØÙÒº /* FILE: myrantst.cpp begins */ #include <cstdlib> // Used in putmat2 #include <cstdio> // Used in putmat2 #include <ctime> #include <string> #include <fstream> #include <iostream> #include <iomanip> ½¼

192 #include "nr.h" #include <cmath> #include "matutl02.h" using namespace std; DP myrdm(int &seed) static int init=1; unsigned seed2=(seed>0)? seed:(-seed); if(init) srand(seed2); init=0; DP t=((dp)rand())/((dp)0x7fffffff); // 2^31 return t; // Driver for routines ran0, ran1, ran2, ran3 DP fnc(const DP x1, const DP x2, const DP x3, const DP x4) return sqrt(x1*x1+x2*x2+x3*x3+x4*x4); void integ(dp func(int &)) const unsigned long twotoj[16]=0x1l,0x2l,0x4l,0x8l,0x10l, 0x20L,0x40L,0x80L,0x100L,0x200L,0x400L,0x800L,0x1000L, 0x2000L,0x4000L,0x8000L; const DP PI= ; int i,idum=(-1),j,jpower,k; DP x1,x2,x3,x4; Vec_INT iy(3); Vec_DP yprob(3); // Calculates pi statistically using volume of unit n-sphere for (i=0;i<3;i++) iy[i]=0; cout << "volume of unit n-sphere, n = 2, 3, 4" << endl; cout << "# points pi (4/3)*pi (1/2)*pi^2"; cout << endl << endl; cout << fixed << setprecision(6); for (j=0;j<15;j++) for (k=twotoj[j];k>=0;k--) x1=func(idum); x2=func(idum); x3=func(idum); x4=func(idum); if (fnc(x1,x2,0.0,0.0) < 1.0) ++iy[0]; ½½

193 if (fnc(x1,x2,x3,0.0) < 1.0) ++iy[1]; if (fnc(x1,x2,x3,x4) < 1.0) ++iy[2]; jpower=twotoj[j+1]; for (i=0;i<3;i++) yprob[i]=dp(twotoj[i+2])*iy[i]/jpower; for (i=0;i<3;i++) yprob[i]=dp(twotoj[i+2])*iy[i]/jpower; cout << setw(6) << jpower << setw(12) << yprob[0]; cout << setw(12) << yprob[1] << setw(12) << yprob[2] << endl; cout << endl << "actual" << setw(12) << PI; cout << setw(12) << 4.0*PI/3.0 << setw(12) << 0.5*PI*PI << endl; cin.get(); int main(void) cout << endl << "Testing ran0:" << endl; integ(nr::ran0); cout << endl << "Testing ran1:" << endl; integ(nr::ran1); cout << endl << "Testing ran2:" << endl; integ(nr::ran2); cout << endl << "Testing ran3:" << endl; integ(nr::ran3); cout << endl << "Testing rand:" << endl; integ(myrdm); return 0; /* FILE: myrantst.cpp ends. */ Testing ran0: volume of unit n-sphere, n = 2, 3, 4 # points pi (4/3)*pi (1/2)*pi^ actual Testing ran1: volume of unit n-sphere, n = 2, 3, 4 # points pi (4/3)*pi (1/2)*pi^2 ½¾

194 actual Testing ran2: volume of unit n-sphere, n = 2, 3, 4 # points pi (4/3)*pi (1/2)*pi^ actual Testing ran3: volume of unit n-sphere, n = 2, 3, 4 # points pi (4/3)*pi (1/2)*pi^ actual Testing rand: volume of unit n-sphere, n = 2, 3, 4 # points pi (4/3)*pi (1/2)*pi^ actual ÐÐĐÓÐÚ ÓÐÑ ÚÖØÐÐÒ Ö ÒÖØØÓÖÒ ØÙÓØØÑ ½

195 ÐÙÙ ÚÑ ÒĐ ÓÒ ÑÙÒ ÙÖ Ò ÐÙ Ø ĐÝØĐÓ Đ ÒÖØØÓÖ randº ÁÒØÖÒØ Đ ÓÒ ØÚÐÐ Ù Ø ØÙÒÒ ÐÙÙÒ ÒÖÓÒØÓ¹ ÐѺ ÅÒØØÓÓÒ Ñº ÊÆÄÁ¹Ö ØÓ Ó ÐĐÓÝØÝÝ Ó ÓØØ ¹ Ø ØØÔ»»ÒØкÐйРºÓÑ»ÒØлÖÒÓÑ»ÒܺØÑÐ º file: ranlib.c.tar.gz ÓÖ ÖÒÓÑ ÒÙÑÖ ÒÖØÓÒ ÖÓÑ Ø ØÖÙØÓÒ ¹ Ø ¹ ÕÙÖ ÜÔÓÒÒØÐ ÑÑ ÑÙÐØÚÖØ ÒÓÖÑÐ ÒÓÒÒØÖÐ ¹ ÕÙÖ ÒÓÒÒØÖÐ ÙÒÚÖØ ÒÓÖÑÐ ÙÒ¹ ÓÖÑ ÒÓÑÐ ÒØÚ ÒÓÑÐ ÑÙÐØÒÓÑÐ ÈÓ ÓÒ Ð Ó ÖÒÓÑ ÔÖÑÙØØÓÒ Ó Ò ÒØÖ ÖÖݺ Ý ÖÖÝ Ïº ÖÓÛÒ ÂÑ ÄÓÚØÓ ÃØÝ ÊÙ ÐÐ Ð µ ijÙÝÖ Ò ÓØ Å ÌÇÅË ½¹½½½ ½½µ ÐÒ file: dcdflib.c.tar.gz ÓÖ ÙÑÙÐØÚ ØÖÙØÓÒ ÙÒØÓÒ ÒÚÖ Ò ÔÖ¹ ÑØÖ ÓÖ Ø ÒÓÑÐ ¹ ÕÙÖ ÒÓÒÒØÖÐ ¹ ÕÙÖ ÒÓÒÒØÖÐ ÑÑ ÒØÚ ÒÓÑÐ ÒÓÖÑÐ ÈÓ ÓÒ ËØÙÒس غ Ð ÚÖÓÙ ÌÇÅË ÐÓÖØÑ Ò ÖÑÓÛØÞ Ò ËØÙÒ ÙÜ Ö ÞÖÓ¹ ÒÒ Ý ÖÖÝ Ïº ÖÓÛÒ Â¹ Ñ ÄÓÚØÓ ÃØÝ ÊÙ ÐÐ ÐÒ Ñº ÊÆÄÁ¹Ö ØÓ ÔĐ ÓØØ ÍÒÜÒ ÑÒÒÑ Ò Đ ÝÝÒ ÓØ ĐÝØØĐĐÒ ÓÐÑÖ ØÓÒ ÐØÑ º ÅÙÙØ ÖÐÐ ÙÙØØ Äº ÚÖÓÝ ÆÓÒ¹ÙÒÓÖÑ ÖÒÓÑ ÚÖØ ÒÖØÓÒ ËÔÖÒÖ¹ ÎÖÐ ½ º ÃÒÙØ Ì ÖØ Ó ÓÑÔÙØÖ ÔÖÓÖÑÑÒ ÎÓк ÁÁº ½

196 8 LAJITTELUMENETELMISTÄ ÆÊÒ Đ ØØÐÑĐ Ø ÄÙÙÓÒÓÒ ĐÖ ØÝ ÙÙÖÙÙ ĐÖ ØÝ Òº ÄÙÙÓÒÓÒ Ò ØÙÐÙÒ ÐØÑÒÒ Ø º ÑÓÒ Ó ÐÓ ÓÒ Ô¹ ÒÒ ØÓ ÔÒÒ Òº ÄÙÙÓÒÓÒ ÖÒÖÙ Ø ØĐĐÒ ÙÒÒ ÐÓÒ ÖÚÓĐÖ ØÝ º 8.1. Algoritmeja. ËÙÓÖ ÐÓÑØÙ ÑÖµ ÓÒ ØÓØÙØØØÙ ÐÓÖØÑÒ NR::piksrtº ÃĐÝØØØĐĐÒ ØÚÒÓÑ Ø ÓÖØØÔÒ ĐÖ ØÝ ÑÒØÐÑĐĐº ¹ĐÖ ØØĐĐÒ ÓÒÓÒ ¾ Ò ÑÑĐ ØĐ ÐÓØ ¹Ð ĐØĐĐÒ º ÐÓ ÑÙÒ ÓÐÐ ÔÐÐÒ ¹ØØÒ ÙÒÒ ÓÓ ÓÒÓ Đ ØÐØݺ ÃÓÑÔÐ ÙÙ Ç Æ ¾ µ ÃÓÐØØÐÙ Ô ÓÖØ ÔÖÙ ØÙÙ ÔÖÓÖØØØÓÒÓÒ Ð ÓÒ ĐÝØØĐÓĐÓÒµ NR::sortº ÁÒ ØÙÐÙÒ ÑÙÓÓ ØÙ ÇÐÑ xindexx.cpp ØÖÚØ ÝĐÓØØÓ ØÓÒ arrin ÌÙÐÓ Ø NR::indx ÓÐÐ NR::arrin(indx(J)), J=1,...,N ¹ ÚÚ ĐÖº ÈÐØØÐÙ NR::qcksrt ÙÐ ÓÖØ ÆÊÒ ÑÙÒ ØÓØÓÒ ÑÐÒÒÒÓØÓÒµ /* FILE: xindexx.cpp begins */ /* Driver for routine indexx */ #include <string> #include <fstream> #include <iostream> #include <iomanip> #include "nr.h" #include "print_array.h" using namespace std; // Driver for routine indexx int main(void) ½

197 const int NP=100; string txt; int i,j; Vec_INT indx(np); Vec_DP a(np); ifstream fp("tarray.dat"); if (fp.fail()) NR::nrerror("Data file tarray.dat not found"); getline(fp,txt); for (i=0;i<np;i++) fp >> a[i]; NR::indexx(a,indx); cout << endl << "original array:" << endl; cout << fixed << setprecision(2); print_array(a,10,7); cout << endl << "sorted array" << endl; for (i=0;i<10;i++) for (j=0;j<10;j++) cout << setw(7) << a[indx[10*i+j]]; cout << endl; return 0; original array: e sorted array e+02 ½

198 9 EPÄLINEAARISET YHTÄLÖRYHMÄT ÐÖÒ ÔÖÙ ÐÙ Ò ÑÙÒ ØØØ Ô ÓÐÚÐÐ ÔÓÐÝÒÓÑÐÐ ÓÒ ØĐ ÑĐÐÐÒ Ô ÙÙÖØ ÓÑÔÐ Ø Ó º ÂÓ Ô ¾ ÒÒ ÙÙ¹ ÖØ ÚÓÒ ØØĐĐ ÐÖÐÐ Ò ÐÙ Ò ÖØÓÑ Ø ÑÙØØ Ú ØÚ ØÝ ÒĐĐ ÓÐ ÑÓÐÐ Ø ÑÐÐĐĐÒ ØÐÐ Ô ØĐÐĐÓÒ ÖØ Ù ÓØ ØÚÐÐ Ø ØÐÒØ Ò Ó ÚÓÒ Ó¹ ÐÐ ÒÙÑÖ Ò ÖØ ÙÑÒØÐÑĐÒ ÓÚÐØÙÚÙÙØغ ÌĐ Đ ÐÙÚÙ ÐÙÓÒ Ø Ù ÒÒ ÑÒØÐÑÒ ÓØ ÓÔÔÖÑÑ ÆÊ ØÖÓ ÔĐÐÒÖ Ò ÝØĐÐĐÓÒ Ø ÝØĐÐĐÓÖÝÑĐÒ ÖØ Ñ Òº ÔÖĐ ÓÒ ØÙØØØÙ ØÓ ÚÙÓ º ½¼¼¹ÐÙÚÙÐØ ÓÒ ÔÖĐ Ò ÆÛØÓÒÒ Ø ÆÛØÓÒÒ¹ÊÔ ÓÒÒ ÑÒØÐÑĐ ÓÒ ÙÔÔÒÑ ¹ ÐÙ ÓÒ ÚÑ ÚÙÓ Ò ÔÝ ÝÒÝØ ÑÝ ØÖÒĐº Î Ø Ò º ÓÑÔй ÝÒÑÒ ØÙØÑÙ ½¼¹ÐÙÚÙÐØ ÐÒ ÓÒ ØÙÓÒÙØ Ò ÙÙØØ ÒĐÑÝ ØĐº ÇÒ Ó ÓØØÙØÙÒÙØ ØØĐ ÙÔÔÒÑ ÐÙ ÓÒ ÓÑØÖ¹ ÐØĐ ØÖÙØÙÙÖÐØÒ ÚÖ Ò ÑÓÒÑÙØÒÒ Ò ÖÙÒ ÓÒ Ò º Ö¹ ØÐÓÙÓº ÃÝ ÝÑÝ ØĐ ÙÔÔÒÓ ØÖØÓ ÒÒØÙÐÐ ÐÙÖ¹ ÚÓÐÐ ÓÒ ÐÐÒ ÚÓÒº ÇÐÓÓÒ Ê Ò Ê Ñ ØÙÚ ÙÒØÓ Ñ Ò ½º Perustehtävä Ø Ü ¾ Ê Ò ºº ܵ ¼º Mahdollisia vaikeuksia: ¹ÊÐ Ò ÖØ ÙÒ ÓÐÑ ÓÐÓ ÔĐÚÖѺ ¹ Đ ØØ ÝÝ ÚÓ ÔÙÙØØÙ Ø ÓÐÐ ÚÒ ÐÓк Å ØĐ ÙÙÖØ Ø ØĐĐÒ Å ØĐ Ò ÝÚĐ ÐÙÖÚÙ ¹ÌÔÙ Ñ Ò ¾ ÓÒ ÚÑÔ ÙÒ ØÔÙ Ñ Ò ½ ÂÓ Ò Ñ ½ ÒÒ ÙÙÖ ÚÓÒ ÐĐÓÝØĐĐ ÔÐÐ ØÑÐÐ Öص Ò Ò ÚĐÐÐÐ Ü ½ Ü ¾ µ ºº Ü ½ µ Ü ¾ µ ¼ ØØÒ ØÖÓÑÐРѺ ÚĐÐÒÔÙÓÐØÙ ÑÒØÐÑĐÐÐĐº ¹ÂÓ ÓÒ ÔĐÐÒÖÒÒ ÒÒ ÖØ ÙÑÒØÐÑĐ ÓÒ Ò Ø¹ ÖØÚÒÒº ÅØÒ ÐĐÓÝØÝÝ ÐÙÖÚÙ ½

199 ¹ÂÙÙÖÒ ÑÙÐØÔÐ ØØغ ÂÓ Ò Ñ ½ ÑÙÐØÔÐ ØØØ Ô¹ ÖÐÐÒÒ ÒÒ ÙÙÖÒ ÔÐÐ ØÑÒÒ ÑÖÒÚØÓÚĐÐÐÐ ØÙÐ ÓÒ¹ ÐÑÐÐ º Ѻ ÙÒØÓÐРܵ Ü ¾ ÓÒ ÙÙÖ ÚĐÐÐÐĐ ½ ½µ Ú ÚÒ ÑÖĐĐÒ ØĐÐÐĐ ÚĐÐÐÐĐº 1 x x. 5 5*x *x. 3 10*x. 2 +5*x 1 =(x 1) ¹ÂÙÙÖÒ ÙÑÙ ÒÙÑÖ ÑÐ Đ ÑÙ ØØØÚ ØÖÙÙ ¹ ÖØÖØĐ ÑĐĐÖĐØØĐ Đº Huom. ØÝ ÑÒÑÓÒØÓÒÐÑÒ ØĐÐĐÓÒ Üµ Ý ¼ Öع Ù ÓÒ Ñ ÙÒ ÙÒØÓÒ Üµ ݵ ¾ ܵ ݵ ܵ ݵ ÑÒѺ Menetelmät: µ Brentin menetelmä ÒÒØØÙ ÝÒ ÑÙÙØØÙÒ ÙÒØÓ Ø¹ ØĐĐÒ ÒÓÐÐÓÒ ÒØÚĐÐ Ø ØĐĐÒ ÙÙÖº ØÖÚØ ÖÚع غ ½¼¹ÐÙÙµ µ Newton(-Raphson) ÃÙØÒ ÝÐÐĐ ÑÙØØ ØÖÚØÒ ÖÚØغ µ Muita menetelmiä ¹ÎĐÐÒÔÙÓÐØÙ ÑÒØÐÑĐ ÖÚÓÒ ØÙÐÙÓÒØ ¹ËÒØØÑÒØÐÑĐ ¹ÈÓÐÝÒÓÑÙÒØÓÐÐ ÓÔÚØ ÑÒØÐÑĐØ ½

200 µ Graafinen ratkaisu ÃĐØÚĐ Ñº ÐÙÖÚÙ Ò Ñ Ò ÑÙй Ð ÑÒØÐÑÐк ÐÓÖØÑ NR::scrshoº 9.1. Juurien paikallistaminen ja välinpuolitusmenetelmä. ÒÐÝÝ Ò Ô¹ ÖÙ ÙÖ ÐÐ ØÓ ØØÒ ÙÖÚ ÐÙ º Rolle n lause. ÇÐÓÓÒ ØÙÚ ÚĐÐÐÐĐ µ µ ¼º ÌĐÐÐĐÓÒ ÐÐĐ ÓÒ ÚĐÐÐÐĐ ÒÓÐÐÓغ ÂÙÙÖÒ ÙÒ ÒÒÐØ ÒÐ Ø ØÓÒÐÑ ÓÒ ÙÖÚ Êع ܵ ¼ ܵ Ü ¾ ½ ÐÓ Üµ ¾ ½ ¾ ÙÙÖØ ÚĐÐÐÐĐ ½¼ µº ÆÊÒ ÐÓÖØÑØ NR::zbrac NR::zbrak ÓÒ ØÖÓØØØÙ Ôй Ð ØÑÒ ÙÙÖº ÌÙ Ò ÒĐĐÒ ØÓÑÚØ ÝÓº ÙÒØÓÒ ØÔÙ ¹ ºµ NR::zbrac ÐÒØ ÐÙÔÖĐ ØĐ ÚĐÐĐ º ¾ NR::zbrak Ô¹ ÒÒØĐеº Välinpuolitusmenetelmä. ÇÐÓÓÒ ØÙÚ ÚĐÐÐÐĐ µ µ ¼ µ¾ ÂÓ µ µ ¼ ÒÒ ÓÖÚØÒ ÐÐ ÑÙÙØÒ ÐÐĐº ÁØÖÓÒº ÌĐÑĐ ÑÒØØÐÝ ÓÐ ÐÐĐ Ó ÄÙÚÙÒ Á ÐÑ mybisect.cppº ȹ ÐÙØØÒ ÐØĐ ÑÐÒ ØØĐ ÐÑ ÓÚÐØÙ ÑÝĐÓ ĐĐÒØ ÙÒØÓÒ ÖÚÓÒ Ð Ñ Òº 9.2. Sekanttimenetelmä ja regula falsi. ÊÙÐ Ð ÑÒØÐÑĐĐ Ùع ÙØÒ Ó Ù ÑÝĐÓ Ð ÔÓ ØÓÒ ÑÒØÐÑĐ º ËĐ ÒØØÑÒØÐÑĐ ØØĐ ÖÙÐ Ð ÙÑÔÒ ÓÐØØÚØ ØØĐ ÙÒØÓÒ ÒÓÐÐÓØ ÓÒ ÔÐÐ ØØØÙ ÚĐÐÐÐ µ ÚÐĐ ÙÒØÓ¹ Ø ÔÔÖÓ ÑÓÒ ÐÒÖ ÐÐ ÙÒØÓÐÐ ÓÒ ÐÙ Ô Ø Ü¹ ÐÒ Ò ÒØ ÙÙÖÐÐ ÐÖÚÓÒ º ÃÙÒÒ ØÖØÓÒ Ò Ý ÑÔ Ô Ø ÙÒÓØÒº ÒÓ ÖÓ ÊÙÐ Ð ĐÐÝØØĐĐ ÑÑ Ø Ô Ø ØĐ Ò Óй Ð ÓÒ ÖÑÖÒÒ ÖÚÓ µò Ò ÓÐÐÓÒ ÒÓÐÐÓØ ÓÒ Ôй Ð ØØØÙ ÚĐÐÐÐ µ Ø µ ÙÒ Ø ÒØØÑÒØÐÑĐ ĐÐÝØØĐĐ ½

201 ÚÑ ÐĐÓÝØÝÒ Ô Ø ØĐ ÒØØÑÒØÐÑĐ Đ ÙÙÖÒ ØÖÚØ ÓÐÐ ÔÐÐ ØØØÙ ÙÙÐÐ ÚĐÐÐÐĐ º Esim. ÇÐØØÒ ØØĐ ÓÒ ÙØÒ ÆÊÒ º ÓÐÚ ÙÚ º¾º¾ ÒØØÑÒØÐÑĐ ÓÒ ØÙÓØØÒÙØ Ô ØØ Ü ½ Ü ¾ Ø º Ò Ò ÐĐÓÝØØÝ Ü ½ ØØÒ Ü ¾ µ ÌĐÐÐĐÓÒ ÒØØÑÒØÐÑĐ ÒØ ÙÙ ÚĐÐ Ü Ü ¾ µ Ó ĐÐÐĐ ÒÓÐÐÓØ ÙÔÔÒÑÒÒ ÔĐÚÖѵº ÐÓÖØÑ NR::rtflsp º NR::rtsec. ËÙÔØ Ò Đ ÒØØÑÒØÐÑĐ ØØĐ ÖÙÐ Ð ÓÚØ Ø¹ Ø ÑÙØØ ÝÐÒ Đ ÑÓÐÑÑØ ÓÚØ ÔÖÑÔ ÙÒ ÚĐÐÒÔÙÓÐØ٠ѹ ÒØÐÑĐº ÑÖ Ó ÖÙÐ Ð ÓÒ ÓÒ ÒÒØØÙ ÖÒ ÚÙÐÐ ÓÐÚ ÃÙÚ º¾º º ¾¼¼

202 9.3. Brentin menetelmä. ÇÒ ÑÖĐ Ó ÒØØÑÒØÐÑĐ ÖÙÐ Ð ÓÚØ ØÑÔ ÙÒ ÚĐÐÒÔÙÓÐØÙ ÑÒØÐÑĐ ÑѺ ÖĐĐØ ÐĐØ ÙÒØÓØ ÓÒ ¾º ÖÚØØ ÑÙÙØØÙÙ ÓÔÚ Ø ÒÓÐй ÓÒ ÐĐÐÐеº Æ º Brentin menetelmä Úº ½ µ Ý ØĐĐ ÒĐÒ ÓÐÑÒ ÑÒØÐÑĐÒ ÝÚĐØ ÔÙÓÐغ ÖÒØÒ ÑÒØÐÑĐÒ ÔÖØØ ¹ ÙÙÖÒ ÔÐÐ ØÙ ¹ ÚĐÐÒÔÙÓÐØÙ ¹ ĐĐÒØÒÒ ÚÖØØÒÒ ÒØÖÔÓÐÓÒØ ËÒØØÑÒØÐÑĐ ÖÙÐ Ð ÔÔÖÓ ÑÓÚØ ÙÒØÓØ ÐÒ¹ Ö Ø Ò ÙÙÖØ ÖÓØØÚÒ ÐÙÚÙÒ ÚĐÐÐÐĐ ÙÒ Ø ĐĐÒØÒÒ ÚÖØØÒÒ ÒØÖÔÓÐÓÒØ ĐÝØØĐĐ ÓÐÑ ÑÔ Ô ØØØĐ ÚÖØØ Ò ÙÒØÓÒ ÓÚØØÑ Ò ÒÒ ÙØØ ÙÙÒ ÐÖ¹ ÚÓÒ ÐĐÓÝØĐÑ Òº ÂÓ ÐĐÓÝØØÝÒ Ô ØÔÖÒ µ µ µ ÓÚ¹ ØØÒ ÄÖÒ³Ò ÒØÖÔÓÐÓÒØÔÓÐÝÒÓÑ ÚØÑÐÐ Ü Ý¹ ÐØ ¾¼½

203 ÒĐĐÒº ËÐÐÓÒ ¼µ ÓÒ ÙÙ ÔÔÖÓ ÑØÓ ÙÙÖÐÐ ÄÖÒ¹ Ò ÚÒ ÒÓÐÐ ÐÐ Ò ÔÐ ØØÒÒ ÐÙ ÐÙÙÒ µ µ µ ÚÙÐк ÖÒØÒ ÑÒØÐÑĐ ÒØ ÙÙÖÒ ÐÖÚÓ ¼µÒ ÑĐÐ ¼µ ÓÒ ÐÐĐ ÚĐÐÐÐĐ ÓÓÒ ÙÙÖ ÓÒ ÙÐØØÙ ÑĐÐ ÚĐÐ ÙØ ØÙÙ ÝÐÐÒ ÒÓÔ Øº ÂÓ ÓØØÒ ¼µÒ Ñ Ø ÚĐÐÒÔÙÓÐØ٠к 9.4. Newtonin menetelmä. ÃĐÝØØĐĐÒ ÔÔÖÓ ÑÓÒØ Ü Æµ ܵ ¼ ÜµÆ ¼¼ ܵ Æ ¾ ¾ ÃÙÒ Æ ¾ Ò ĐÐØĐÚĐ ØÖÑ ÙÒÓØÒ ÒÒ ÚØÑÙ Ü Æµ ¼ ܵ ÓØ ÐÙ Ò Æ ÓÐÐÓÒ Ü Æ ÓÒ ÙÙÖÒ ÔÔÖÓ ¹ ¼ ܵ ÑØÓº Newtonin algoritmi. ÃÒÒØØĐĐÒ Ü ¼ ØØÒ Ü ½ Ü Ü µ ¼ Ü µ ½ ¾ ÇÐØØÒ ØØĐ ¼ ܵ ¼ ÐÓÖØÑ NR::rtnewt º Newtonin algoritmi vaimennuksella. ÃÙØÒ ÐÐĐ ÑÙØØ ÝÚĐ ÝØĐĐÒ Ü ½ ÚÒ Ó Ü ½ µ Ü µ ÅÙÙ ØÔÙ ÔÙÓÐØØÒ ÐÔØÙÙØØ Æ ÙÒÒ ØĐÑĐ ØÓ ØÙÐ ÚÓÑÒº ÆÛØÓÒÒ ÑÒØÐÑĐĐ Ò ÖĐ ØĐ ÔÙÐÑØÐÒÒØØ ÚÒÒÓй Ð ØÚØ ÆÊÒ ÚÙÐÐ ÓÐÚØ ÙÚØ ºº½ ºº¾ ÓØ ÓÚØ ÑÝĐÓ Ó Òº ¾¼¾

204 ¾¼

205 ÐÓÖØÑ NR::rtsafe ĐÐØĐĐ Ð ĐÔÖØØĐ ØĐĐ ÙÙ Ò ¹ ÐÒ ÖÑ ÒÚĐÐÐØĐ ÓÐÐ ÒÓÐÐÓØ Ø ØĐĐÒº // FILE: mysafe.cpp begins #include <iostream> #include <iomanip> #include "nr.h" using namespace std; // Driver for routine rtsafe DP fx(const DP x) return exp(x)-3*x*x; void funcd(const DP x,dp &fn, DP &df) fn=exp(x)-3*x*x; df=exp(x)-6*x; int main(void) const int N=100,NBMAX=20; const DP X1=1.0,X2=50.0; int i,nb=nbmax; DP xacc,root; Vec_DP xb1(nbmax),xb2(nbmax); NR::zbrak(fx,X1,X2,N,xb1,xb2,nb); cout << endl << "Roots of f(x):" << endl; cout << setw(20) << "x" << setw(16) << "f(x)" << endl; cout << fixed << setprecision(6); for (i=0;i<nb;i++) xacc=(1.0e-6)*(xb1[i]+xb2[i])/2.0; root=nr::rtsafe(funcd,xb1[i],xb2[i],xacc); cout << "root" << setw(4) << (i+1) << setw(15) << root; cout << setw(15) << fx(root) << endl; return 0; // FILE: mysafe.cpp ends ¾¼

206 Roots of f(x): x f(x) root e-11 à ÒÒ Ý ÝÑÝ ÆÛØÓÒÒ ØÖØÓ ÓÒ ÑØÒ ÐĐÓÝØĐĐÒ ÐÐÒÒ ÐÙÔ Ø Ü ¼ Ó Ø ØÖØÓ ÙÔÔÒ ÓØ ÙÙÖغ ÀÝÚĐ ÐÙÖÚÙ Ò Ñº Ö Øº ÂÓ Ù ÚÓÒ Ó¹ ÚÐØ ÙÖÚ ÐÙ Øغ Lause. ÇÐÓÓÒ Ø ØÙÚ Ø ÖÚÓØÙÚ ÙÐØÙÐÐ ÚĐÐÐÐĐ ÓÐÓÓØ ÙÖÚØ ÓØ ÚÓÑ ½µ µ µ ¼ ¾µ ¼ ܵ ¼ ÙÒ Ü ¾ µ ¼¼ ܵ ÓÒ ÓÓ ¼ Ø ¼ ÙÒ Ü ¾ µ µ ¼ µ µ ¼ µ ÌĐÐÐĐÓÒ ÆÛØÓÒÒ ÑÒØÐÑĐ ÙÔÔÒ ÓÒ ÝØĐÐĐÓÒ Üµ ¼ Ý Đ ØØ ØĐ ÙÙÖØ ÐÐ ÐÙÖÚÓÐÐ Ü ¼ ¾ Esim. ÇÐÓÓÒ Üµ ÖØÒ Üº ËÐÐÓÒ ÝØĐÐĐÓÐÐРܵ ¼ ÓÒ ÙÙÖ Ü ¼º ÆÛØÓÒÒ ØÖØÓ ÓÒ ÒÝØ Ü ½ Ü ½ Ü ¾ µ ÖØÒ Ü º ÂÓ Ü ¼ ÚÐغ ºº ÖØÒ Ü ¼ ¾Ü ¼ ½ ܼ ¾ ÒÒ ÓÒÓ Ü ÒØÙÙº й ÐÓÐÚ Ø ÚÓ Ø ÐÑÒ ÆÛØÓÒÒ ÐÓÖØÑÒ ĐÝØØĐÝØÝÑÒÒ Ö ÐÙÖÚÓÐÐ e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e+21 ¾¼

207 ÌÙÐÙÓÒ Ò ÑÑĐÒÒ Ö ÐÑÓØØ ØÖØÓÖÖÓ Ò ÒÙ¹ ÑÖÓÒ ¼ ÝÐÒ ÚÖÚ ÒØ ÐÙÖÚÓغ ÀÚØÒ ØØĐ Ð¹ ÙÖÚÓÐÐ ¼º ½º¼ ½º¾ ÐÓÖØÑ ÙÔÔÒ ÓØ ÐÙØØÙ ÙÙÖØ ÙÒ Ø ÐÙÖÚÓÐÐ ½º ½º ÒØÙÙº Esim. ËÙÖÚ ÑÖ ÐÚØØĐĐ ÆÛØÓÒÒ ØÖØÓÒ ÙÔÔ¹ ÒÑ Ø Óº ÙÒØÓÐÐ ÓÓ Ø ÐÑÒÚÒ ÐÙÖÚÓÒº // FILE : mynewt.cpp begins // Solves f(x)=0 by Newton s method for several // functions f. #include<cmath> #include<iostream> #include<iomanip> using namespace std; double fx(int n, double x) double t; switch (n) case 1:t= sin(x)-x*x*x-1.0; break; case 2:t= x-log(x)-3.0; break; case 3:t= x*x*x-x-1.0; break; case 4: t= sin(x)-x-2.0; break; case 5: t= pow(x+1.0,5.0)*(x-1.0); break; default: t=1.0; return t; double dfx(int n, double x) double t; switch (n) case 1: t= cos(x)-3*x*x; break; case 2:t= /x; break; case 3: t= 3*x*x-1.0; break; case 4: t= cos(x)-1.0; break; case 5:t= pow(x+1.0,5.0)+(x-1.0)*5*pow(x+1.0,4.0); break; default: t=1.0; ¾¼

208 return t; int main() int i,n; double x, xsta[] =-1.0, 2.0, 1.5, 2.5, 0.5; for (n=0;n<5;n++) x=xsta[n]; cout<<"function "<<n+1<<" : \n"; for (i=0;i<6;i++) cout.setf(ios::scientific); cout<<setw(14)<<x<<" "<<setw(14)<<fx(n+1,x)<<endl; x=x-fx(n+1,x)/dfx(n+1,x); return 0; // FILE : mynewt.cpp ends Function 1 : e e e e e e e e e e e e-16 Function 2 : e e e e e e e e e e e e-16 Function 3 : e e e e e e e e e e e e-16 Function 4 : e e+00 ¾¼

209 e e e e e e e e e e+01 Function 5 : e e e e e e e e e e e e-03 ÃÖÓØØÑÐÐ ³ ܵ Ü Üµ ¼ ܵ ÙÓÑØÒ ØØĐ ÆÛØÓ¹ ÒÒ ØÖÓÒØ ÓÒ ÑÖ ÒØÓÔ ØØÖÓÒÒ Ø Ó Ø Ó ÐÐĐ ÄÙÚÙ ½ ¾ ÓÐ ÔÙØغ Ä Đ ³ ¼ ܵ ܵ ܵ ¼ ܵ ¾ µ Lause. ÇÐÓÓÒ Ê Ø ØÙÚ Ø ÖÒØÓØÙÚº ÇÐØÑÑ ØØĐ ÓÒ ÓÐÑ ÚÓ ¾ ¼ ½µ ÓÐÐ ÐÐ Ü ¾ ÔĐØ Üµ ¼¼ ܵ ½ ¼ ܵµ ¾ ËÐÐÓÒ ÆÛØÓÒÒ ØÖØÓ ÙÔÔÒ ÐÐ ÐÙÖÚÓÐÐ Ü ¼ ¾ Lause. ÇÐÓÓÒ Ê Ø ØÙÚ Ø ÖÒØÓØÙÚº ÇÐØÑÑ ØØĐ ¼¼ ܵ ¼ ÚĐÐÐÐĐ Ð Đ µ ¼ µ ¼ ËÐÐÓÒ ÆÛØÓÒÒ ØÖØÓÒ ÑÙÓÓ ØÑ Ô ØÓÒÓ ÐÙÖÚÓÐÐ Ü ¼ ÙÔÔÒ ÑÓÒÓØÓÒ Ø ÓØ ÙÙÖغ Yhteenveto Newtonin menetelmästä. ÁØÖØÓÒ ÐØ ÑĐĐÖĐÝØÝÚĐØ ĐÝÖĐÐÐ ÔÖÖØØÝÒ ØÒÒع ØÒ ÐÙ Ô Ø ØĐ Ü¹ ÐÒ Ò º ÀÝÚĐ ÐÙÖÚÙ ÓÒ ØÖÔÒº ÅÙÙØÒ ØÖØÓ ÚÓ ÒØÙ Ø ÙÔØ ÓÒ ÐÙÙ Ó ÓÐ ÙÙÖº ÂÓÔ ÔÒ ÑÙÙØÓ Ð¹ ÙÖÚÓÓÒ ÚÓ ÚÙØØ ÓÐÐÐ Ø ÐÓÖØÑÒ ĐÝØØĐÝØÝÑ Òº ÂÓ ÑÒØÐÑĐ ÙÔÔÒ ÒÒ ÓÒÚÖÒ ÓÒ ØÚÐÐ Ø ÚÖ¹ Ò ÒÓÔº ¾¼

210 ËÓÚÐØÙÙ ÑÝĐÓ ÓÑÔÐ ÙÙÖÒ Ø Ñ Òº ÄÙÓØØÐÙ ÙÔ¹ ÔÒÚÒ ÒØÙÚÒ ÐÙÖÚÓÒ ÓÒ Ú ÚÖغ ÆÊÒ ÚÙÐÐ ÓÐÚ ÃÙÚ ººº 9.5. Polynomin juuret. ÈÖÙ ÓØ ÔÓÐÝÒÓÑÝØĐÐĐÓÒ ÖØ Ù ÓÚØ ÙÖÚغ Ò ØÒ ÔÓÐÝÒÓÑÐÐ ÓÒ Ò ÙÙÖØ ÑÙÐØÔÐ ØØصº ÂÓ ÓÒ ÙÙÖ ÒÒ ÑÝĐÓ ÓÒ ÙÙÖº ÂÓ ÓÒ ÐĐÓÝØØÝ ÔÓÐÝÒÓÑÒ È ÙÙÖ Ü ¼ ÒÒ È Ü Ü ¼ µé ܵ ØĐ Ü Ü ¼ µ ÚÓÒ ÔÓ º ÐÓÖØÑ NR::zroots Ø ÔÓÐÝÒÓÑÒ È Ò ½ ½ µü ½ ÒÓй ÐÓغ ÐÓÖØÑ NR::zrootsÒ ØÓÑÒÒ ÓÒ ¾ ÚØØ µ Ø ØĐĐÒ ÐÙ ØÚØ ÙÙÖغ µ ÈÖÒÒØÒ ÐÙ ØÚÒ ÙÙÖÒ ØÖÙÙØغ ¾¼

211 Juurien sijainti kompleksitasossa. ÂÓ ÔÓÐÝÒÓÑ È Ò Üµ Ü Ò Ò ½ Ü Ò ½ ½ Ü ¼ ÓÒ ÖÐÖØÓÑÒÒ Å ÐÐ ÒÒ È Ò Ò ÒÓÐÐÓØ Ø ÚØ Ø ÓÒ ÝÑÔÝÖĐ Đ Þ Þ Å ½º ÂÓ Ð Đ ØØĐĐÒ ØØĐ ¼¹ÓØ ÓÚØ ÖÐ ÒÒ Ò ¹ ÓÚØ ÝØĐÐĐÓÒ ÒÜ ¾ ¾ Ò ½ Ü ¾ Ò ½µ Ò ¾ Ò ¾µ ¾ Ò ½µ ¼ ÖØ ÙÒ ÑĐĐÖĐĐÑĐÐÐĐ ÖÐ ÐÒ ÚĐÐÐÐĐ Ò º ÄÙÖÖÒ ÐÙ µº 9.6. Newtonin menetelmä usealle yhtälölle. ØĐÐĐÓÖÝÑĐÒ Ü Ýµ ¼ ½µ Ü Ýµ ¼ ÖØ Ù ÚÖØÒ ÓÒ Ø ØØĐÚĐ Ô ØÓÙÓÒ ½ ¼µ ½ ¼µ ¹ ØÓÔÓÐÓ Ø ÓÑÔÓÒÒØغ ËÑÓÒ ÙÒ ÝÒ ÑÙÙØØÙÒ ØÔÙ¹ ÝÚĐ ÐÙÖÚÙ ÓÒ ØĐÖĐ ÆÛØÓÒÒ ÐÓÖØÑÐÐ ÑÝĐÓ ÓÖ¹ ÑÑ ÑÒ Ó º ÆÛØÓÒÒ ÐÓÖØÑ Ó Ú ØÙØÑÙ ÓÒ Ðº ÖĐ ØÙØÑÙ Ò ÙÙÒØ ÐØØÝÝ ÐÓÖØÑÒ ÙÔÔÒÑ Ó¹ ÑÒ ÙÙ Ò ÔÖÒØÑ Ò ÐÓÖØÑ ÓÔÚ Ø ÑÓ ÓÑÐк ÌĐØĐ ÓÒ ÒÓÙØØØÙ Ò º ÐÓÐ Ø ÙÔÔÒÚ ÆÛØÓÒÒ ÐÓÖØÑ Ó ØÙÐ ÐÑÔÒ Ðк ÐÒÒ ÔĐÐÒÖÒÒ ÝØĐÐĐÓÖÝÑĐ ÓÒ ÑÙÓØÓ µ ¼ Ü ½ Ü Æ µ ½ Æ ÌÝÐÓÖÒ Ú ÒØ ÔÔÖÓ ÑØÓÒ Æµ µ Æ ½ Ü ÆÜ Ç Æ ¾ µ ÍÒÓØÒ Ç Æ ¾ µ¹øöñ ÚØÒ Æµ ¼º ËÒ È Æ½ «¾µ ÆÜ ÆÜ ½ Æ Ü Ô ½µ Ü Ôµ ÌĐ Đ Ô ÓÒ ØÖØÓ ÐÒ ÒÙÑÖÓº ÄÙÚÙØ ÆÜ Ò ÖØ ¹ ÑÐÐ ¾µ Ä͹ÑÒØÐÑĐÐÐĐº ÐÓÖØÑ NR::mnewt º ½µº ¾½¼

212 ÃÙØÒ ÃÓÒ º ÐÓÔÙ ÒÒØØÙ ÑÖ Ó ÓØØ ÝÚĐ Ð¹ ÙÖÚÙ ÓÒ ÓÐÐÐÒÒ ÆÛØÓÒÒ ÑÒØÐÑĐÐк Lause ÆÛØÓÒ¹ÃÒØÓÖÓÚØ µ ÇÐÓÓÒ Ò Öµ Ü ¾ Ê Ò Ü Ö Ò ½µ Ê Ò ØÙÚ Ø «ÖÒØÓØÙÚ ÙÖÚØ ÓØ ÚÓÑ µ ܵ ݵ Ü Ý Ü Ý ¾ Ò ½µ µ ¼µ ½ ¼µ «µ ¼µ ½ ÅÖØĐĐÒ «ÂÓ ½¾ Ö ½ ½ ÒÒ ÓÒÓ Ö ½¾ ½ Ô ½ ¾ «Ü ½ Ü Ü µ ½ Ü µ Ü ¼ ¼ ¼ ½ ¾ ÔÝ ÝÝ ÓÙÓ Ò Ö ½ µ ÓÒÚÖÓ ÓØ Ò ½¹Đ ØØ ØĐ ÙÙÖØ ÓÙÓ Ò Ö ¾ µº ÌÓº à º Ѻ ËØÓÖ¹ÙÐÖ º 9.7. Esimerkkejä Newton-iteroinnista. ËÓÚÐØÑÐÐ ÆÛØÓÒÒ ÑÒ¹ ØÐÑĐĐ Ü Ò ½ Ü Ò Ü Ò µ ¼ Ü Ò µ ØÔÙ Ò Üµ ½Ü Ü ¾ Ü Ô Ò ĐĐÒØ ÐÙÚÙÒ Ð Ñ ÐÐ ÙÙÖÒÓØÓÐÐ Ù¹ ÖÚØ ÐÓÖØÑØ Ü Ò ½ Ü Ò ¾ Ü Ò µ ½ ¼ Ü ¼ ¾ Ü Ò ½ ½ ¾ Ü Ò Ü Ò µ Ô Ü ¼ ¼ Ü Ò ½ ½ ½ Ô µü Ò ÔÜÒ Ô ½ Ô Ô Ü ¼ ¼ 9.8. Lopetuskriteereistä. ÎÖÖ ØÓÐÖÒ ÚÓÒ ÚÐØ Ñº ÚØÑÐÐ ØØĐ ÙØÐÐÒÒ ÚÖ ½¼ º ÀÙÓÑ ØØĐ ÒÓÐÐÒ ÐĐÐÐĐ ÙØÐÐÒÒ ÚÖ ÚÓ ÓÐÐ ÓÒÐÑй ÐÒÒ ÒÑØØĐĐ Đ ÑÓÐÐ Ø ÓÐÚÒ ÒÓÐÐÒ ÚÙÓ º ¾½½

213 ÅÙØ ÑÓÐÐ ÖØÖØĐ ÚÖ Ü ½ ܾ Ñ Đ Ü ¾ ½ Ü ¾ ÔÐÐ ØÚØ ÙÙÖÒ ½¼ º ÄÓÔØÙ Ó ÚÓÒ ÚÐØ ÑÝĐÓ ÝÐĐÖ ØÖØÓÒ ÐÙÙ¹ ÑĐĐÖĐÐк 9.9. Globaalisti suppeneva Newtonin menetelmä. ÐÐĐ ÓÒ Ó ÝÒ ÑÙÙØØÙÒ ØÔÙ ØÙÐÐÙØ ÐÐ ÆÛØÓÒÒ ÑÒØÐÑĐÒ ÚÖÐع ØÙ ØÖØÓÒ ÐÙÔ ØÒ ÚÐÒÒÐк ÆÛØÓÒÒ ÑÒØÐÑĐĐ ÚÓ¹ Ò ÑÒ ÓÖØ ÒÒ ØØĐ ØÙ ÑÒØÐÑĐ ÙÔÔÒ ÐĐ ¹ ÐÐ ÐÙÖÚÓÐк ÇÔÔÖ ÑÑ ÓÒ ØĐÐÐÒÒ ÓÖØØÙ ÆÛØÓÒÒ ÑÒØÐÑĐ Ò º ÐÓÐ Ø ÙÔÔÒÚ ÑÒØÐÑĐº ÄĐØĐÓÓØÒ ÓÒ ÓÖØ ÆÛØÓÒÒ ÑÒØÐÑĐĐ ÒÒ ØØĐ ÓØØÒ ÆÛØÓÒ¹ Ð ÚÒ ÑĐÐ ØÖ ØÐØÚÒ ÙÒØÓÒ ÒÓÖÑ ÚĐÒ ÖÖÝØØĐ Đ ÙÙ¹ ØÒ Ô Ø Ò ÑÙÙÐÐÓÒ ØĐĐÒ ÆÛØÓÒÒ ÐÒ ÙÙÒÒ ¹ ÐÝÑÔ ÑØ ØÒ ØØĐ ÙÙ Ô Ø Đ Óº ÒÓÖÑ ÓÒ Ô¹ ÒÑÔº Á ÓÒ ØĐ ÑĐÐÐÒ Ñ ÙÒ ÝÒÑÙÙØØÙÒ ÆÛØÓÒÒ ÑÒØÐÑĐÒ ÝØÝ Đ ÑÒØÙÐÐ ÚÑÒÒØÙÐÐ ÆÛØÓÒÒ ÑÒ¹ ØÐÑĐÐÐĐº ÌĐÑĐ ÓÒ ØÓØÙØØØÙ ÐÓÖØÑ NR::newt.c º ÓÒ ĐÝØĐÓ ØĐ ÓÒ ÑÖ Ðк // FILE: mynewt2.cpp begins // Solves a system f(x,y)=0 by improved Newton method // with several initial values #include<iostream> #include<iomanip> #include<cmath> #include "nr.h" #include "gnusurf.h" #define SCALE 1 #define N 2 using namespace std; void funcv(vec_i_dp &x,vec_o_dp &f) ¾½¾

214 f[0]=sqr(x[0])+sqr(x[1])-2.0; f[1]=exp(x[0]-1.0)+x[1]*sqr(x[1])-2.0; double ff(double x, double y) Vec_DP u(n), v(n); DP tmp; u[0]=x; u[1]=y; funcv(u,v); tmp=v[0]*v[0]+v[1]*v[1]; return pow(tmp, 0.5); int main() int i, p,k; bool check; Vec_DP x(n),f(n),x0(n); double xx[]=-2.,10.,yy[]=-2.,10.; for (k=0;k<=3;k++) for (p=0;p<=3;p++) x[0]=0.5+k; x0[0]=x[0]; x[1]=0.5+p; x0[1]=x[1]; cout<<" \n \n"; cout<<"before iteration: \n"; for (i=0;i<n;i++) printf("%5d %12.6f %12.6f %12.4e\n",i,x0[i],x[i],f[i]); NR::newt(x,check,funcv); funcv(x,f); if (check) cout<<"convergence problems.\n"; cout<<"after iteration: \n"; printf("%5s %12s %12s %12s\n","Index","xstart", "x","f"); for (i=0;i<n;i++) printf("%5d %12.6f %12.6f %12.4e\n",i,x0[i],x[i],f[i]); cout<<"enter x0:\n"; cin>>x[0]; cout<<"enter y0:\n"; cin>>x[1]; x0[0] = x[0]; x0[1] = x[1]; ¾½

215 NR::newt(x,check,funcv); printf("%5s %12s %12s %12s\n","Index","xstart", "x","f"); for (i=0;i<n;i++) printf("%5d %12.6f %12.6f %12.4e\n",i,x0[i],x[i],f[i]); gnusurf(ff,xx,yy,scale,0,"ff(x,y)"," ff(x,y) "); return 0; // FILE: mynewt2.cpp ends /* After iteration: Index xstart x f e e Before iteration: e e-09 After iteration: Index xstart x f e e Before iteration: e e */ ¾½

216 ff(x,y) ¾½

217 10 MINIMOINTI JA MAKSIMOINTI Johdantoa ÊÐÖÚÓ Ò ÙÒØÓÒ Ñ ÑÓÒØ ÔÐÙØÙÙ ÑÒÑÓÒØÒ ÐÐĐ Ò Ñ ÑÓÒØ ÓÒ Ñ ÙÒ µò ÑÒÑÓÒغ È ØØ ÙÐÚØ Ø ÔÐÐ ØÚØ Òк Öص ѹ ÒÑÒ Ó ÙÒØÓÒ ÖÚÓ Đ ÓÒ ÔÒÑÔ ÙÒ Đ Øº Ø º µ ÑÒ µ µ ÇÔØÑÓÒغ ÈÖÙ ØØĐÚĐÒĐ ÓÙÒØÓÒ ÓØ ÙÒØÓÒµ ѹ ÒÑÓÒØ ØÚÐÐ Ø Ù ÑÑÒ ÑÙÙØØÙÒ ÙÒØÓµº Rajoitettu optimointi Òк ÓÒ ØÖÒ ÓÔØÑÞØÓÒµº ÌĐÐÐĐÓÒ ÑÙÙع ØÙÐÐ ÓÒ ÔÖÓÖ¹ÖÓØ٠Ѻ ÖØ ÙÒ ÓÒ ÓÐØÚ ØØÝ Đ ÐÙ¹ º Lineaarinen ohjelmointi (LO) Òк ÐÒÖ ÔÖÓÖÑÑÒ Äȵµº ÆÝØ ÑÒÑÓØÚ ÙÒØÓ ÑÝĐÓ ÖÓعÓØ ÐÒÖ º ÊØ Ùѹ ÒØÐÑĐÒĐ ÓÒ Ò º ÑÔÐ ÐÓÖØѺ ÆÊÒ ÙÓ ØÙ Ø ÓÔØÑÓÒØÐÓÖØÑ Ø ÓÚØ ÑÒ ÓÒ ÑÙ¹ Ò ÓØÐØÙÒ ÙÖÚغ Yksiulotteinen minimointi. ÁÐÑÒ ÖÚØØÓÒ ĐÝØØĐÓĐ ÖÒØÒ ÑÒØÐÑĐ Ø ÙÐع Ò ÐÙ Ò Ùº ÖÚØØÓÒ ÚÙÐÐ ÖÒØÒ ÑÒØÐÑĐÒ ÔÖÒÒÙ Ó ĐÝع ØĐĐÒ ÖÚØØÓº Moniulotteinen minimointi. ÅÙ ØØÐÒ ØÖÚ Æ Ø Æ ¾ ÚÓ ÓÐÐ ÔÙÐÐÓÒÙÐÒ Ó ÚÖÙÙÒ ÑÒ Ó Æ ÓÒ ÙÙÖº ÆÐÖ¹ÅÒ ÑÔÐ Ù ¹ÑÒØÐÑĐ ÖÚØØÓ ØÖ¹ Úغ ÔĐ ÓØØ ÐÒÖ Ò ÓÐÑÓÒÒÒ ÑÔÐÜ ÑÒ¹ ØÐÑĐĐÒºµ ¾½

218 ËÙÙÒØÓÙÓ¹ÑÒØÐÑĐ ÈÓÛÐÐÒ ÑÒØÐÑе ØÖÚØ ¹ ÖÚØØÓº ÌÖÚØÒ ½¹ÙÐÓØغ ÑÒÑÓÒÒÒ ÐÐÓÖØÑ ÙØÒ ÖÒغ ÖÚØØÓÒ ĐÝØØĐÓĐÓÒ ÔÖÙ ØÙÙ ¾º ÐÓÖØÑÐÙÓ Ó Ø Ùѹ ÔÒ ØÖÚØ ½¹ÙÐÓØØ Ò ÑÒÑÑÓÒÒÒ ÐÐÓÖØÑÒº µ ÓÒÙØØÖÒØØÑÒØÐÑĐØ Ñº ÐØÖ¹ÊÚ ÈÓй ÊÖ ÑÒغµ ÑÙ ØØÐÒ ØÖÚ Æµ µ Ú ¹ÆÛØÓÒ ÑÒØÐÑĐØ Ñº Ú ÓÒ¹ÐØÖ¹ÈÓÛÐРȵ Ø ÖÓÝÒ¹ÐØÖ¹ÓÐÖ¹ËÒÒÓ Ëµ ÑÙ ØØÐÒ ØÖÚ Æ ¾ µº Yleishuomautuksia. ½¹ÙÐÓØغØÔÙ Ò ÑÒÑÒ Ù ¼ Ò ¼¹ÓØÒ Ù ÅÓÒÙÐÓØØ ØÔÙ ĐÝØØĐĐÒ Ù Ò ÐÐ ÑÒѹ Ô ØÒ ÐĐ ÝÝ Đ ÚÖØØ Ø ÔÔÖÓ ÑØÓغ ÅÒÑÓÒ¹ ÒÒ ÒÒÐØ ÒÐ ÑÖÙÒØÓ ØØ ÓÐРѺ Ü Ýµ Ü ½¼ Ý ½¼ º ÐÓÖØÑÒ ØÓÑÒØ ÆÊ Đ ÙÚØ Ý ØÝ ÓØ Ø ÙÙÖ Ñ ĐĐÒº ÌĐÑĐ Ó ÑÝĐÓ ÓÔØÑÓÒØÐÓÖØÑĐº ÅÝĐÓ ĐĐÒ ÓÒ¹ ÚÖÒ ØÓ ØÙ ØØĐº Jyrkimmän laskun menetelmä. ÃÖÑÑ ØØÐ Ò º ÝÖÑÑĐÒ Ð ÙÒ Òк ØÔ Ø Òص ÑÒØÐÑĐĐ Ó ÓÒ Ñº ÑÒØÐÑĐ ÔÐÓÒ ÓÑÔº ÃÓ ¹ ØĐÑĐ ÑÒØÐÑĐ ÓÒ ÙØÒÒ ÓÑØÖ Ò ÒØÙØÓÓÒ ÚØÓ¹ Ú ÖØØĐÒ Ý ÒÖØÒÒ ØÓØÙØØ ÓÒ ÐÓÖØÑ ÙÖ Ò ÛÛÛ¹ ÚÙÐÐ ØÚ mysteep5.cppº ØÙ Ò ÓÒ ÑÙÓÓ Ø ÑÙÖØÓ¹ ÚÚ ØÒ ØØĐ ÐĐ ØÝ ÙÒØÓÒ ÑÒÑÓغ ÎÐØÒ Ò Ò ÐĐØĐÓÔ Ø ØĐĐÒ ØĐ Ò ÙÙÒØÒ Ó ÙÒØÓ ÚÓѹ ÑÑÒ ÚĐÒ ÙÒÒ ÐĐÓÝØĐĐÒ ÙÒØÓÒ ÐÓÐ ÑÒÑ ØĐÐÐĐ ÙÙÒÒÐк ÌÓ ØØÒ Ñ ÙÙ Ô Ø Đº ÈÐÙØØÒ ÑÐÒ ØØĐ Ñº ÚÓÑÑÑÒ ÚĐÒÑ Ò ÙÙÒ¹ Ø ÓÒ ÙÒØÓÒ ÒØÚ Ò ÖÒØÒ ÙÙÒغ ÖÒØÒ Ð ÙÙÒ ĐÝØĐÑÑ ÐÓÖØÑ numjf.cppº ÃÓÙÒØÓÒ ÔØĐĐ ÓÐÐ ¹ ¾½

219 ÖÚÓØÙÚº ÇÒ ÐÔÔÓ Ó ÓØØ ØØĐ Ò ÔÖĐĐ Ò ÑÙÖØÓÚÚÒ Ó Ò ÓÐÚÒ ÒÒ ÚĐÐÒÒ ÙÐÑ ÓÒ ÙÓÖº 10.1 Kultaisen leikkauksen haku. ÇÐÓÓÒ º ËÒÓØÒ ØØĐ Ô ØØ ÖÓØØÚØ Øº ÔÐÐ ØÚØ Øº ÙÐÚØ Øº ÖÙÓ¹ Úص ÑÒÑÒ Òк Öص Ó µ ÑÒ µ µº ÍÙ ÑÒÑÒ ÖÓØØÚ ÓÐÑÓ ÐĐÓÝØĐĐÒ ÙÖÚ Ø ½µ ÌÔÙ º ÎÐØÒ Ü ¾ µº ÂÓ µ ܵ µ Ü ÖÓØØÚØ ÑÒÑÒ Üµº ÂÓ Üµ µ µ Ü ÖÓØØÚØ ÑÒÑÒ Üµ ¾µ ÌÔÙ ÙØÒ ÝÐÐĐ ÑÙØØ ÚÐØÒ Ü ¾ µ ÁØÖÓÑÐÐ ÚØ ½µ ² ¾µ ÙÒÒ ÒѺ ØÓÐ ÐĐÓÝØĐĐÒ Ñ¹ ÅØÒ ÙÙÖ ØÖÙÙ ÚÓº ÚÙØØ ÇÐÓÓÒ ÑÒÑÓØ ÓÐÐÓÒ ¼ µ ¼º ÌÝÐÓÖ µ ܵ µ ½ ¾ ¼¼ µ Ü µ ¾ ¾½