49 lines
1.1 KiB
C++
49 lines
1.1 KiB
C++
#include <iostream>
|
||
#include <vector>
|
||
#include <iomanip>
|
||
#include <cmath>
|
||
using namespace std;
|
||
/*
|
||
double calc(const vector<double>& func, int x){
|
||
int n = func.size();
|
||
double ans = 0;
|
||
for(int i = 0; i < n; i++){
|
||
ans += pow(x, n-i) * func[i];
|
||
}
|
||
return ans;
|
||
}*/
|
||
//秦九韶算法
|
||
double calc(const vector<double>& func, double x){
|
||
double ans = 0;
|
||
for(double y: func){
|
||
ans = x * ans + y;
|
||
}
|
||
return ans;
|
||
}
|
||
int main(){
|
||
int n;
|
||
double l, r;
|
||
n = 3; l = -0.9981; r = 0.5;
|
||
//cin >> n >> l >> r;
|
||
//任取两个点,把[l, r]分成三段,调整l, r的值
|
||
vector<double> func(n+1);
|
||
func[0] = 1; func[1] = -3; func[2] = -3; func[3] = 1;
|
||
/*for(int i = 0; i < n; i++){
|
||
|
||
}*/
|
||
double mid1, mid2;
|
||
double ans = 0;
|
||
while(r - l > 1e-6){
|
||
mid1 = l + (r-l)/3;
|
||
mid2 = r - (r-l)/3;
|
||
if(calc(func, mid1) > calc(func, mid2)){
|
||
r = mid2;
|
||
} else if(calc(func, mid1) <= calc(func, mid2)) {
|
||
l = mid1;
|
||
}
|
||
|
||
}
|
||
cout << fixed << setprecision(8) << l << endl;
|
||
return 0;
|
||
}
|