二分查找 Problem 1002 Strange fuction

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);
    }
}


發佈了48 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章