二分法求零点
作者:互联网
二分法求函数的零点
题目链接
先来个简单的题目
有函数:
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