首页 > 技术文章 > ybt 第二部分 基础算法 --> 第七章 分治算法 1241:二分法求函数的零点

jd1412 2020-03-02 15:18 原文

1241:二分法求函数的零点


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 3263     通过数: 1974 

【题目描述】

有函数:f(x)=x515x4+85x3225x2+274x121f(x)=x5−15x4+85x3−225x2+274x−121

已知f(1.5)>0,f(2.4)<0f(1.5)>0,f(2.4)<0 且方程f(x)=0f(x)=0 在区间[1.5,2.41.5,2.4] 有且只有一个根,请用二分法求出该根。

【输入】

(无)

【输出】

该方程在区间[1.5,2.41.5,2.4]中的根。要求四舍五入到小数点后66位。

 

源代码

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;

double f(double x)
{
	return x*x*x*x*x-15*x*x*x*x+85*x*x*x-225*x*x+274*x-121;
}

int  main(void)
{
	double i=1.5;
	double j=2.4;
	double xx;
	
	while(i+0.000001<j)
	{
		xx=(i+j)/2.0;
		
		if(f(xx)>0)
		{
		    i=xx;
		}
		
		if(f(xx)<0)
		{
			j=xx;
		}
		
		if(f(xx)==0)
		{
			printf("%.6lf",xx);
			return 0;
		}
 	}
 	
 	if(f(i)==0)
 	{
 		printf("%.6lf",i);
 		return 0;
	}
	
	else
	{
		printf("%.6lf",j);
		return 0;
	}
} 

这道题的分治主要体现在探求他的取值范围。

已知x=1.5时,f(x)>0,x=2.4时,f(x)<0,且方程的具体解在[1.5,2.4]的范围之间,那么这个函数在定义域[1.5,2.4]的范围内应为单调递减,所以在二分的时候,

应注意:当f(x)>0时,不是将中值mid赋给右端的j,而是赋给左端的i,(在这里WA了好几次,QWQ),当f(x)<0时相反。

这道题就是不断地取i,j的中值,进行查找比较,当找到符合使f(x)=0的值时停止,当在一遍查找结束后应将左端加上1e-6来缩小取值范围(或在右端减去),直

到找到满足条件的值或i>j时退出循环,输出。

找到止

推荐阅读