立方方程式二分法が要求ルーツ範囲の主題によれば、解決[-100100]
トピックが与えられているので、すべての根は-100と100の間であり、ルートゾーンがどうなるかで考えてみましょう
そして、根と根の間の差は、条件1の限界未満ではない、それが発見されました、
インナー、... [99、100]、[100,100] 201この区間[99、-98] - [-100、-99]で
ルートまでの各区間内に存在するので、区間[100、100]の除去、[--100、100]ができ、
他の区間[+ 1]、またはf(A)= 0、またはF(A + 1)この式がこの範囲0で唯一の解決策×F(A)<。
方程式の2根を求めます
(a、b)は、我々は、より低い精度の根の値を決定することが可能ルート方法の範囲を狭くすることができる徐々に間隔で式f(x)= 0の場合、唯一のルートを決定します。次のように精度を所定のタイトルルートは、方程式の根内の次の要件の二分の間隔(a、b)は0.01です。
(1)現在の存在は(b)の間隔をとることができます。
+ 0.001> BまたはF((A + B)/ 2)= 0の場合(2)、ルート(A + B)/ 2と出口手順として決定されてもよいです。
(3)もし、F×F(A)((+ B)/ 2)<0、次いで間隔で根((A + B)/ 2)、
故对区间(a, (a+b)/2)重复该过程;
F(A)は、f×((A + B)/ 2)> 0の場合(4)、次いで、((A + B)/ 2)×F(B)<0、がfとしなければなりません
也就是说根在((a+b)/2,b)中,应该对此区间重复该过程。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//本题中特别注意的函数abs(),abs是取整数的绝对值,返回整数值
//fabs()才是用来求浮点数的绝对值,返回浮点数
float a,b,c,d;
float f(float x) //返回函数值的函数
{
return a*x*x*x+b*x*x+c*x+d;
}
int main(int argc, char *argv[]) {
float i,x,x1,x2;
int ans=0; //用于统计解的个数
scanf("%f%f%f%f",&a,&b,&c,&d);
// printf("%.2f\n",f(-0.5));
for(i=-100;i<100;i++)
{
if(abs(f(i)*f(i+1))==0) //首先判定f(i)=0的解
{
if(abs(f(i))==0)
{
x=i;
ans++;
printf("%.2f ",x);
}
}
else if(f(i)*f(i+1)<0) //满足解在范围[i,i+1]内的条件
{
x1=i;
x2=i+1;
x=(x1+x2)/2;//若解在[i,i+1]内,采用二分法,查找解
while(fabs(f(x))>0.000001&&(x1+0.001)<x2)
{ //由于实数运算的误差,判断x是否满足方程f(x)=0
//应用条件表达式 fabs(f(x))<0.000001来判断,否则将失根。
// printf("%.2f\n",f(x));
if(f(x)*f(x1)>0)//若f(x)*f(x1)>0,则根在[x,x2]范围内
{
x1=x; //修改根的范围
x=(x1+x2)/2;
// printf("%.2f %f\n",x,f(x));
}
else
{
x2=x; //否则f(x)*f(x1)<=0,则根在[x1,x]范围内
x=(x1+x2)/2;
// printf("%.2f %f\n",x,f(x));
}
}
ans++;
printf("%.2f ",x);//输出在[i,i+1]内,使用二分法找到的解
}
if(ans>=3) break;
}
return 0;
}