其他分享
首页 > 其他分享> > 二分法求零点

二分法求零点

作者:互联网

二分法求函数的零点

题目链接
先来个简单的题目
有函数:
f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121
已知 f(1.5) > 0 , f(2.4) < 0 且方程 f(x) = 0 在区间 [1.5,2.4] 有且只有一个根,请用二分法求出该根。
输出
该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。
就是用f的函数求值来判断是否到达零点.

#include<iostream>
#include<math.h>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
double f(double x)
{
	return pow(x,5)-15.0*pow(x,4)+85*pow(x,3)-225*pow(x,2)+274*x-121.0;
}
int main()
{
	double l=1.5,r=2.4;
	double mid;
	while(r-l>1e-6)
	{
		mid=(l+r)/2;
		if(f(mid)>0)
		{
			l=mid;
		}
		else
			r=mid;
	}
	printf("%.6lf",mid);
}

Strange fuction

题目链接
现在,有一个函数:
F(x)= 6 * x7 + 8 * x6 + 7x3 + 5x2-y * x(0 <= x <= 100)
你能当x在0到100之间时,找到最小值。

输入值

输入的第一行包含一个整数T(1 <= T <= 100),它表示测试用例的数量。然后是T行,每行只有一个实数Y。(0 <Y <1e10)

输出值

当x在0到100之间时,仅是最小值(精确到小数点后4位)。

样例输入

2
100
200

样例输出

-74.4291
-178.8534

代码实现

题目要求输出最小的fx值,范围是从0到100,y>0.对fx求导可知开始的fx是递减的,然后x上去后再递增,所以最低点就是fd的零点.

#include<iostream>
#include<math.h>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
double fx(double x,double y)
{
	return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;
}
double fd(double x,double y)
{
	return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y;
}
int main()
{
	double x,y,t,mid;
	cin>>t;
	while(t--)
	{
		scanf("%lf",&y);
		double l=0.0,r=100.0;
		while(r-l>1e-6)
		{
			mid=(l+r)/2;
			if(fd(mid,y)>0)
			{
				r=mid;
			}
			else
			{
				l=mid;
			}
		}
		printf("%.4lf\n",fx(mid,y));
	}
}

标签:fx,pow,mid,二分法,double,零点,include,2.4
来源: https://blog.csdn.net/weixin_47701814/article/details/111029772