¨ç¼Æ¨D®Ú¡G¥þ°ì¦¬ÀĪº¤û¹yªk
°ò¥»Æ[©À
¤û¹yªk¦b«e±¦³¤¶²Ð¡AY¬O¥Î¦hºû«×ªº²Å¸¹¡A¥¦ªºÃöÁä¬O¬O§Q¥Î±×²v§ä¥X dx ¡G
§ÚÌ«e±¦³¬Ý¹L¤û¹yªkªº¯ÊÂI¡A¤]´N¬O¥¦§Q¥Î²q´úÂI³Bªº¨ç¼ÆÈ°£¥H¸Ó³Bªº±×²v¡]¥~±a¤@Ót¸¹¡^¦Ó¹w´ú¤U¤@¨Bªº³oºØ§@ªk¡A¦³®É·|§â¤U¤@¨B±a¥X¦³®Ä½d³ò¥~¡]¦b®Úªº®ÇÃ䦳¤@Ó¤p§|ªº®ÉÔ¡A´N®e©öµo¥Í³oÓ²{¶H¡^¡A©Î¬O«ê¥©³´¤J©¹´_¤£¤îªºµL½a°j°é¡C
³o¨Ç°ÝÃD¡A³£¸òª½±µ¨Ï¥Î±×²v¸ê°T¡]§Yªñ¦ü¨ç¼Æ¬°½u©Ê¡^¹w´ú¤U¤@ÂIªº¨B´T¦³Ãö¡C´«¥y¸Ü»¡¡A¤û¹yªkªº¹w´ú¨B¦³®É½Ä±o¤Ó§Ö¤Ó¦h¡A§Y«K¬O¸¨¤J¤p§|¬}¤¤¡A¥un¯à¥¿½T°»´ú¨ì¬O°±¦b§|©³ªºª¬ªp¡A¤]³£ÁÙ¥i¥H¥t¥~²q´úÂI¦Ó«·s¶}©l¡A¦ý¤û¹yªk¸I¨ì³oºØª¬«h·|®g¥X½d³ò¥~¤Ó»·¡C
¨ä¹ê¡A»¡¤û¹yªk·|¦³½Ä±o¤Ó§Ö³oºØ¶É¦V¡A¯uªº¬O«Ü¶K¤Á¡C
¦b«e±ªº³æ¤¸½Í¤û¹yªk¡A¦³´£¨ì§ä·¥¤pªº¤èªk¨Ã¤£¯à®M¥Î¥Î¦b¡]¤û¹yªk¡^¨D®Úªº°ÝÃD¤W (NR 9.6)¡C¦b¦³¸É±Ï¤û¹yªk¤§¥Dn¯ÊÂIªº±¡ªp¤U¡A§ä·¥¤pªºµ¦²¤´N¥i¥HÀ°§U¤û¹yªkÅܦ¨¤@Ó¥i¾a¦³®Äªººtºâªk¡^¡C
±×²v¤è¦V¤W«OÃÒ¦³³Ì¤pÈ¡A¥un dx °÷¤pªº¸Ü¡A¤j®a¥iª½Æ[·Q¹³©Î°Ñ¬Ý½Ò¥»¤½¦¡¡C¤]´N¬O»¡¡A§Ṳ́£¯à§¹¥þ¬Û«H¤û¹yªkªº¨B¿ç¤j¤p¡A¦ý¤è¦V«h¥i¥H¡C¦pªG¥Î¤½¦¡¨Ó¸ÑŪ¡A¨£¤U±¨â¦¡ªº©w¸q»P±À¾É¡G
³oùةҵ¹¥Xªº°T®§¬O¡A¤û¹yªkªº¤è¦Vªº½T¯à°÷Åýì¨ç¼Æªº¥¤èÅܤp¡A¤]´N®µ±a¤F¯à°÷§ä¨ì®Úªº¼ç¤O¡C¦pªG±×²vªº¤è¦V¬O¹ïªº¡A§Ú̧â¤û¹yªkªº¨B´T¨«¤p¤@ÂI¡A«h«OÃÒ¯à°÷§âì¨ç¼Æªºµ´¹ïÈÅܤp¡A¦p¦¹¥²µMÅýì¨ç¼Æ§ó±µªñ®Ú¤F¡C³oÓ·Qªk¤Þµo½u©Ê·j´Mªºµ¦²¤¡A¤]´N¬O¦b«O¦³ì¤û¹yªk¤è¦Vªº±¡ªp¤U¡A´ú¸Õ¨Ã½Õ¸`¨äªø«×¥H¹F¨ì¹ï¨ä¥¤è¨ç¼Æ§ä·¥¤p¡C¦pªG³´¤JµL®Úªº¤p§|¡A«h·|¦A¥t§ä°_ÂI«·s·j´M¡C
½u©Ê·j´M»P˰h°lÂÜ (Line searching and Backtracking) ¬O¨âÓ¥Dnªºµ¦²¤¡A²Ó¸`ªº¤½¦¡±À¾É (9.7.6) ~ (9.7.14) ¥i°Ñ¦Ò½Ò¤å¡C
°Æµ{¦¡ªº¨Ï¥Î
»Ýn¥Î¨ì¥H¤Uªº°Æµ{¦¡©Î¨ç¦¡¡A¦@¤»Ó
newt¡G¥þ°ì¦¬ÀÄ«¬¤û¹yªkªº¥Dn°Æµ{¦¡
lnsrch ¡G½u©Ê·j´M¡A¥Ñ newt ¥s¥Î
fmin ¡G¨D¨ç¼Æ¥¤èªºÈ¡A¬On³Q·¥¤p¤Æªº¹ï¶H
fdjac ¡G µ¹¨ç¼Æ fvec ´N¥i¥H±o Jacobian
ludcmp¡GLU ¤À¸Ñªkµ{¦¡
lubksb¡GLU ¦V«á¨ú¥N¨D¸Ñµ{¦¡
¨Ï¥Î newt ªº½d¨Ò¥Dµ{¦¡¡A¤Ï¦Ó¬Û·í²³æ¡A¥unµ¹ªì©l²q´úªº¦V¶q¡A¦p¤U¨Ò¡G
program newt_main
implicit none
integer n,i,i_again
parameter (n=2)
real x(n)
logical check100¡@write(*,*) 'Type in the vector x(1:',n,') as initial guess :'
read (*,*) (x(i),i=1,n)
c "n" is used to declare x(n) in subroutine newt, we therefore need
c to make "n" an parameter in the main program.call newt(x,n,check)
write(*,*) 'The resulting root vector is :'
write(*,*) (x(i),i=1,n)102¡@write(*,*) 'Find root again ? (1=YES; 0=NO)'
read(*,*) i_again
if (i_again.eq.1) goto 100
if (i_again.ne.0) goto 102end
subroutine funcv(n,x,f)
integer n
real x(n),f(n)
f(1) = x(1)**2 + x(2)**2 - 25
f(2) = x(2)
end