假位法其實就是第一次要判f0*f2是否小於零
若小於零再用插值法(secant method)逼近
牛頓法:
#include<stdio.h>
#include<math.h>
#include<process.h>
#include<conio.h>
double f(double x);
double f_1(double x);
int main(void)
{
clrscr();
double x0,x1,f0,f1,m,k;
int i,loop=10;
x0=1;
for (i=1; i<=loop; i++)
{
printf("#%d\n",i);
k=f0=f(x0);
m=f_1(x0);
if ( m == 0 )
{
printf("m is zero!\n");
exit(1);
}
x1=x0-(k/m);
f1=f(x1);
printf("Xn = %f\n",x0);
printf("Fn = %f\n",f0);
printf("F'n= %f\n",m);
printf("X(n+1) = %f\n",x1);
printf("F(n+1) = %f\n\n",f1);
if ( f1 == 0 || fabs(f1) < 1.0e-5 )
break;
x0=x1;
f0=f(x0);
}
printf("The true value is %f\n",x1);
return 0;
}
double f_1(double x)
{
return ( 3+cos(x)-exp(x) );
}
double f(double x)
{
return ( 3*x+sin(x)-exp(x) );
}
--
※ 發信站: 批踢踢實業坊(ptt.twbbs.org)
◆ From: cs-dial-port19-tpe.biglobe.net.뼊