// ------------------------------------------------------
// newton-method
//
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
// ------------------------------------------------------
double A, B, C, M, N;
double func( double x)
{
// func(x) = A*e^(m*t)+B*e^(n*t) - C
return
A
* exp ( M
* x
) + B
* exp ( N
* x
) - C
; }
double funcd( double x)
{
// funcd(x) = func'(x)
// funcd(x) = A*m*e^(m*t)+B*n*e^(n*t)
return
A
* M
* exp ( M
* x
) + B
* N
* exp ( N
* x
) - C
; }
// -------------------------------------------------------
double NewtonRoot( double x0, /* 初點 */
double ( * fx) ( double ) , /* 適應函式*/
double ( * fd) ( double ) , /* 微分函式*/
double eps, /* 容許誤差*/
int max_itera) /* 最大迭代*/
{
double x= x0;
do {
x0= x;
x = x0 - fx( x0) / fd( x0) ;
} while ( fabs ( x
- x0
) > eps
&& max_itera
-- ) ; return x;
}
// -------------------------------------------------------
int main( )
{
const double eps= 1E-15 ;
const int max_iterator= 1000000 ;
double x0, x;
puts ( "A * e^(mx) + B * e^(nx) - C = 0 < newton method >" ) ;
x = NewtonRoot( x0, func, funcd, eps, max_iterator) ;
printf ( "func(x) : %.15lf\n " , func
( x
) ) ; // system("pause"); // 看不到結果加入這行
return 0 ;
}
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIG5ld3Rvbi1tZXRob2QKLy8gCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSA8c3RkbGliLmg+Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkb3VibGUgQSwgQiwgQywgTSwgTjsKZG91YmxlIGZ1bmMoZG91YmxlIHgpCnsKCS8vIGZ1bmMoeCkgPSBBKmVeKG0qdCkrQiplXihuKnQpIC0gQwoJcmV0dXJuIAoJCUEgKiBleHAoTSp4KSArIEIgKiBleHAoTip4KSAtIEM7Cn0KCmRvdWJsZSBmdW5jZChkb3VibGUgeCkKewoJLy8gZnVuY2QoeCkgPSBmdW5jJyh4KQoJLy8gZnVuY2QoeCkgPSBBKm0qZV4obSp0KStCKm4qZV4obip0KQoJcmV0dXJuIAoJCUEgKiBNICogZXhwKE0qeCkgKyBCICogTiAqIGV4cChOKngpIC0gQzsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkb3VibGUgTmV3dG9uUm9vdChkb3VibGUgeDAsLyogICDliJ3pu54gICovCglkb3VibGUgKCpmeCkoZG91YmxlKSwgICAvKiDpganmh4nlh73lvI8qLwoJZG91YmxlICgqZmQpKGRvdWJsZSksICAgLyog5b6u5YiG5Ye95byPKi8KCWRvdWJsZSBlcHMsICAgICAgICAgICAgIC8qIOWuueioseiqpOW3riovCglpbnQgbWF4X2l0ZXJhKSAgICAgICAgICAvKiDmnIDlpKfov63ku6MqLwp7Cglkb3VibGUgeD14MDsKCWRvewoJCXgwPXg7CgkJeCA9IHgwIC0gZngoeDApIC8gZmQoeDApOwoJfXdoaWxlKGZhYnMoeC14MCk+ZXBzICYmIG1heF9pdGVyYS0tKTsKCXJldHVybiB4Owp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBtYWluKCkKewoJY29uc3QgZG91YmxlIGVwcz0xRS0xNTsKCWNvbnN0IGludCBtYXhfaXRlcmF0b3I9MTAwMDAwMDsKCWRvdWJsZSB4MCwgeDsKCglwdXRzKCJBICogZV4obXgpICsgQiAqIGVeKG54KSAtIEMgPSAwIDwgbmV3dG9uIG1ldGhvZCA+Iik7CglwcmludGYoImlucHV0IEEgOiAiKTsgc2NhbmYoIiVsZiIsICZBKTsKCXByaW50ZigiaW5wdXQgQiA6ICIpOyBzY2FuZigiJWxmIiwgJkIpOwoJcHJpbnRmKCJpbnB1dCBDIDogIik7IHNjYW5mKCIlbGYiLCAmQyk7CglwcmludGYoImlucHV0IE4gOiAiKTsgc2NhbmYoIiVsZiIsICZOKTsKCXByaW50ZigiaW5wdXQgTSA6ICIpOyBzY2FuZigiJWxmIiwgJk0pOwoJcHJpbnRmKCJpbnB1dCB4MDogIik7IHNjYW5mKCIlbGYiLCAmeDApOwoKCXggPSBOZXd0b25Sb290KHgwLCBmdW5jLCBmdW5jZCwgZXBzLCBtYXhfaXRlcmF0b3IpOwoJCglwdXRzKCIiKTsKCXByaW50ZigieCAgICAgICA6ICUuMTVsZlxuIiwgeCk7CglwcmludGYoImZ1bmMoeCkgOiAlLjE1bGZcbiIsIGZ1bmMoeCkpOwoJLy8gc3lzdGVtKCJwYXVzZSIpOyAvLyDnnIvkuI3liLDntZDmnpzliqDlhaXpgJnooYwKCXJldHVybiAwOwp9