上一篇文章中的牛頓迭代法的收斂速度快,但每迭代一次,除需計算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");
- }
- }
- }