-
例题
-
这道题看上去不能直接用二分法去做,反而要用三分法。但是 只要把这个函数取导之后找到这导数的驻点就ok了。
但是什么是导数呢?因为导数实在是太多了,这里就不一一列举了。这里只说明一下幂函数的导数,幂函数的导数为:f(x)=x^n
那么 f(x)的导数为nx^(n-1)
所以这道题就很好理解了,现在来看代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
double a[50];
int n;
double ds(double l) {//求导数的值
double p=0;
for(int i=n; i>=1; i--) {
int y=i;
double o=a[i];
y-=1;
while(y>0) {
o*=l;
y--;
}
p+=o;
}
return p;
}
void efda(double l,double r) {
if(r-l<=1e-6) {
printf("%0.5lf",l);
exit(0);//结束
}
double mid=(l+r)/2,lp=ds(mid);
if(lp<0)
efda(l,mid);//这里用二次函数在草稿纸上枚举一次就可以知道怎么二分答案了
else if(lp>0)
efda(mid,r);
else {//如果导数为零,直接输出
cout<<mid;
exit(0);//结束
}
}
int main() {
double l,r,pp;
cin>>n>>l>>r;
for(int i=n; i>=1; i--) {
cin>>a[i];
a[i]*=i;//为了方便求导数
}
cin>>pp;
efda(l,r);
}