标签:cti 区间 clu inpu real rip efi 方法 最大
Problem Description
分析:
求函数的最小值,首先求导的导函数为:G(x) = 42 * x^6+48*x^5+21*x^2+10*x-y (0 <= x <=100)
分析导函数的,导函数为一个单调递增的函数。如果导函数的最大值小于0,那么原函数在区间内单调递减。
即F(100)最小;如果但函数的最小值大于0,那么原函数在区间内单调递增,即F(0)最小。如果导函数既有正又有负
又由于导函数是单增函数,所以必有先负后正,即原函数必有先减后增的性质。求出导函数的零点就是原函数的最小值点。
求导函数最小值方法是2分法.
代码:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
#define a 1e-10
double min(double x, double y)
{
double f;
f = 42 * pow(x, 6) + 48 * pow(x, 5) + 21 * pow(x, 2) + 10 * x - y;
return f;
}
double f(double x,double y) {
return 6 * pow(x, 7) + 8 * pow(x, 6) + 7 * pow(x, 3) + 5 * pow(x, 2) - y * x;
}
int main()
{
int n;
cin >> n;
while (n--)
{
double high = 100.0;
double low = 0.0;
double mid;
double y;
cin >> y;
if (min(100.0, y) <= 0)
{
cout << setiosflags(ios::fixed) << setprecision(4) << f(100.0, y) << endl; //setiosflags(ios::fixed) ,setprecision(4)保留小数点后四位
continue;
}
if (min(0.0, y) >= 0)
{
cout << setiosflags(ios::fixed) << setprecision(4) << f(0.0, y) << endl;
continue;
}
while (high - low >= a)
{
mid = (low + high) / 2;
if (min(mid, y) >= a)
high = mid;
else
low = mid;
}
cout << setiosflags(ios::fixed) << setprecision(4) << f(mid, y) << endl;
}
return 0;
}
标签:cti 区间 clu inpu real rip efi 方法 最大
原文地址:https://www.cnblogs.com/zhangfuxiao/p/9319974.html