定义了三个函数分别对应二分法,牛顿迭代法,Steffenson法求解方程的根。
main.c
#include<stdio.h>
#include"solve.h"
double fun(double);
int main()
{
printf("求解函数x^3+4x^2-10=0的解\n\n");
double e=1e-5;//e为精度
printf("=======二分法=======\n");
double xl,xr,xx;
xx = erfen(xl,xr,e);printf("二分法的解为:%lf\n",xx);
printf("=======牛顿迭代法=======\n");
double x0;
x0 = Newtondiedai(x0,e);printf("牛顿迭代法的解为:%lf\n",x0);
printf("=======Steffenson法=======\n");
x0 = Steffenson(x0,e);printf("Steffenson法的解为:%lf\n",x0);
}
double fun(double x)
{
return x*x*x+4*x*x-10;//所求方程
}
sovle.h
double erfen(double,double,double);
double fun(double);
double Newtondiedai(double,double);
double Steffenson(double,double);
solve.c
#include <stdio.h>
#include "solve.h"
#include <math.h>
double erfen(double xl,double xr,double e)
{
double xx;
do
{
printf("输入左值:");scanf("%lf",&xl);
printf("输入右值:");scanf("%lf",&xr);
}while(fun(xl)*fun(xr)>0);
do
{
xx = (xl+xr)/2;
if(fun(xx)*fun(xl)<0) xr=xx;
else xl=xx;
// printf("xx=%lf\n",xx);
}while(fabs(fun(xx))>e);
return xx;
}
double Newtondiedai(double x0,double e)
{
printf("输入初始点:");scanf("%lf",&x0);
double x1,fundao,delta=0.0001;
fundao = (fun(x0+delta)-fun(x0))/delta;
//if(fundao == 0);return 0;
do
{
x1 = x0 - fun(x0)/fundao;
x0 = x1;
// printf("xx=%lf\n",x0);
}while(fun(x0)>e);
return x0;
}
double Steffenson(double x0,double e)
{
printf("输入初始点:");scanf("%lf",&x0);
double x1;
do
{
x1 = x0 - (fun(x0)*fun(x0))/(fun(x0+fun(x0))-fun(x0));
x0 = x1;
// printf("xx=%lf\n",x0);
}while(fun(x0)>e);
return x0;
}