上一篇文章中的牛顿迭代法的收敛速度快,但每迭代一次,除需计算f(x)的值外还要计算f'(x)的值。如果f(x)比较复杂,计算f'(x)的工作量可能很大。为避免使用导数值,我们可以采用割线法求方程的根。
实例代码:
- /*割线法*/
- #include <stdio.h>
- #include <math.h>
- float (*f)(float) = NULL;
- float f1(float x)
- {
- return x*x - exp(x);
- }
- float f2(float x)
- {
- return x*exp(x) - 1;
- }
- float f3(float x)
- {
- return log10(x) + x -2;
- }
- float Secant(float x0,float x1)
- {
- return (x1 - (f(x1)*(x1-x0))/(f(x1)-f(x0)));
- }
- void main()
- {
- int number,k=2;
- float x0,x1,x2;
- printf("请输入要求解的方程序号(1/2/3) : ");
- scanf("%d",&number);
- switch(number)
- {
- case 1: f = f1;break;
- case 2: f = f2;break;
- case 3: f = f3;break;
- default: printf("没有这样的方程!/n");break;
- }
- if (f)
- {
- printf("请输入x0 x1的值:");
- scanf("%f%f",&x0,&x1);
- printf("x[0] = %-10f,x[1] = %-10f ",x0,x1);
- while (1)
- {
- if (k>=21) break;
- x2 = Secant(x0,x1);
- x0 = x1;
- x1 = x2;
- printf("x[%d] = %-10f ",k,x2);
- k++;
- if (k%3==0) printf("/n");
- }
- }
- }