分析:
上凸函数的三分法
简单强调一下函数的求法:
秦九韶算法
一般地,一元
n
n
次多项式的求值需要经过次乘法和
n
n
次加法,而秦九韶算法只需要次乘法和
n
n
次加法
在人工计算时,一次大大简化了运算过程
把一个次多项式
f=anxn+an−1xn−1+...+a1x+a0
f
=
a
n
x
n
+
a
n
−
1
x
n
−
1
+
.
.
.
+
a
1
x
+
a
0
改写成如下形式:
f(x)
f
(
x
)
=anxn+an−1xn−1+...+a1x+a0
=
a
n
x
n
+
a
n
−
1
x
n
−
1
+
.
.
.
+
a
1
x
+
a
0
=(anxn−1+an−1xn−2+...+a1)x+a0
=
(
a
n
x
n
−
1
+
a
n
−
1
x
n
−
2
+
.
.
.
+
a
1
)
x
+
a
0
=((anxn−2+an−1xn−3+...+a3x+a2)x+a1)x+a0
=
(
(
a
n
x
n
−
2
+
a
n
−
1
x
n
−
3
+
.
.
.
+
a
3
x
+
a
2
)
x
+
a
1
)
x
+
a
0
...
.
.
.
=(anxn−1+an−1xn−2+...+a1)x+a0
=
(
a
n
x
n
−
1
+
a
n
−
1
x
n
−
2
+
.
.
.
+
a
1
)
x
+
a
0
求多项式的值时,首先计算最内层括号内一次多项式的值,即
v0=an
v
0
=
a
n
v1=anx+an−1
v
1
=
a
n
x
+
a
n
−
1
然后由内向外逐层计算一次多项式的值,即
v2=v1x+an−2
v
2
=
v
1
x
+
a
n
−
2
v3=v2x+an−3
v
3
=
v
2
x
+
a
n
−
3
...
.
.
.
vn=vn−1x+a0
v
n
=
v
n
−
1
x
+
a
0
这样,求
n
n
次多项式的值就转化为求
n
n
个一次多项式的值。
结论:对于一个次多项式,至多做n次乘法和n次加法
tip
注意dcmp的精度
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define LD long double
using namespace std;
const double eps=1e-6;
const double deps=1e-10;
const int N=15;
int n;
double L,R,a[N];
int dcmp(double x)
{
if (fabs(x)<deps) return 0;
else if (x>0) return 1;
else return -1;
}
double f(double x)
{
double ans=0;
for (int i=n;i>=0;i--)
ans=ans*x+a[i];
return ans;
}
double sanfen()
{
double m1,m2;
while (R-L>=eps)
{
m1=L+(R-L)/3;
m2=R-(R-L)/3;
double f1=f(m1);
double f2=f(m2);
if (dcmp(f1-f2)>0)
R=m2;
else L=m1;
}
return (m1+m2)/2;
}
int main()
{
scanf("%d",&n);
scanf("%lf%lf",&L,&R);
for (int i=n;i>=0;i--) scanf("%lf",&a[i]);
printf("%0.5lf",sanfen());
return 0;
}