一、二分法
1.二分法概念:二分法,又称分半法,是一种方程式根的近似值求法。对于区间[m,n]上连续不断且f(m)*f(n)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫做二分法(bisection)。
2.二分法思路:
(1)求已知函数f(x)=0的根,先找一个区间[m,n],使得f(m)*f(n)<0,即f(m)与f(n)异号,根据介值定理,这个区间内一定包含着方程式的根。
(2)求该区间的中点i=(m+n)/2,并找出f(i)的值。
(3)若f(i)与f(m)同号,即f(m)*f(i)>0,则取新的区间[i,n],否则取[m,i]。
(4)重复第二步和第三步,直到得到理想的精确度为止。
3.以下为二分法解题的代码(用codeblocks可运行)
#include<stdio.h>
#include<math.h>
int main()
{
double m,n;
double i,sum;
double eps=1e-6;//eps是精度控制,此处为10^-6,表示无限小
double a,b,c,d;
double f1,f2;
printf("请输入一元三次方程标准形式a*x^3+b*x^2+c*x+d的系数a b c d:\n");
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
printf("请输入取值区间:\n");
scanf("%lf%lf",&m,&n);//注意abcdmn都是%lf而不是%d
f1=a*pow(m,3)+b*pow(m,2)+c*m+d;//pow(x,y)=x^y,幂函数
f2=a*pow(n,3)+b*pow(n,2)+c*n+d;
//判断f1*f2<0是主要代码
if(f1*f2<0)
{
while(fabs(m-n)>eps)
{
i=(m+n)/2;
sum=a*pow(i,3)+b*pow(i,2)+c*i+d;
if(fabs(sum)<eps)//如果函数f(i)的绝对值|sum|小于无限小
{
printf("方程的一个近似解为x*=%lf\n",i);
break;
}
else if(f1*sum<0)
{
n=i;
}
else if(f2*sum<0)
{
m=i;
}
}
}
//如果刚好区间取值为方程解
else if(f1*f2==0)
{
if(f1==0)
{ printf("方程的一个解为x*=%lf\n",m);}
if(f2==0)
{ printf("方程的一个解为x*=%lf\n",n);}
}
else
{ printf("方程在该区间内无解!\n");}
return 0;
}
4.运行结果如下:
参考文章:
https://jingyan.baidu.com/article/597a06438def54312a524376.html
https://blog.csdn.net/Xue_fabulous/article/details/105125596
二、公式法
参见小小小罗成的文章https://blog.csdn.net/weixin_44889344/article/details/108700037