Problem ID:1002 Can you solve this equation?
简单题意:F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x,已知y的值,且x的范围在0到100之间,求F(x) 的最小值。
解题思路形成过程:先求出F(x) 的导数:F'(x) =42*x^6+48*x^5+21*x^2+10*x-y。当x=0时,F'(x) =-y。所以F(x)是在0<=x<=100的范围内是先递减后递增的函数。利用二分法求出使F'(x)=0的x值,即可求出F(x)的最小值。
感想:求函数的导数是分析一个数学公式的重要工具。分析数学关系,分析清楚后则问题即迎刃而解。
代码:
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
double fun(double x,double y)
{
return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y;
}
int main()
{
int n;
cin>>n;
while(n--)
{
double y;
scanf("%lf",&y);
double l=0,r=100;
double mid=(l+r)/2;
while(fabs(fun(mid,y))>1e-9){
if(fun(mid,y)>0){
r=mid;
mid=(l+r)/2;
}
else{
l=mid;
mid=(l+r)/2;
}
}
printf("%.4lf\n",6*pow(mid,7)+8*pow(mid,6)+7*pow(mid,3)+5*pow(mid,2)-y*mid);
}
}