Rose N. Blatt is designing an embedded neural network to place inside a cell phone. When trained by the phone’s
owner, the neural network will enable the user to dictate text messages in a hands-free way. The key idea in Rose’s
design is the use of complicated polynomial response functions in each of the nodes of the network (rather than the
more traditional thresholding functions used in many other neural nets). Figure 1 shows a portion of such a neural
network (the polynomials are not accurately graphed).
When Rose was ready to select her polynomials, she discovered a problem. Due to the limited amount of memory
available, she did not have enough space to store all of the coefficients of the polynomials in her network. She has
decided to use an approximation to each polynomial in the form of a continuous polygonal curve with two segments,
y = aB1Bx + aB0B and y = bB1Bx + bB0B. The segments meet at a point whose x-coordinate, c, is between -1 and +1. Rose wants
the approximation to be the best in the sense that the distance between p and the approximation function g is
minimal. We define the distance between p and g as the integral of the square of their difference:
For instance, if the polynomial is x^2-0.2, then the best polygonal approximation, with lines meeting at c = 0, is shown in Figure 2 (the dotted line shows the graph of the polygonal approximation).
In the few bytes that are available for each node, Rose can store the values of aB1B, aB0B, bB1B, bB0B, and c as signed numbers.
Fortunately Rose has a program that supplies her with a good guess for the value of c. Given this value, you are
asked to help Rose find the optimal values for aB1B, aB0B, bB1B, and bB0B in the approximations to her polynomials.
Input
The input file contains multiple test cases. Each test case consists of three lines. The first line contains a positive
integer n, 1 ≤ n ≤ 10, representing the degree of the polynomial p(x). This is followed by a line containing n +1
numbers between -1 and 1 inclusive, which are the coefficients of p(x) from highest order term down to the constant
term, expressed with at most three places after the decimal point. The last line for each test case contains the value
for c, -1 < c < 1, expressed with at most three places after the decimal point.
A line containing the integer zero follows the last test case.
Output
For each test case, print the case number (beginning with 1) and the four optimal values, displaying each with exactly
three places after the decimal point. The first and second values are the parameters a1 and a0 of the line segment
y = a1x + a0 defining g in the range -1 ≤ x ≤ c. The third and fourth values are the parameters b1 and b0 of the line
segment y = b1 + b0 defining g in the range c ≤ x ≤ 1. The distance d(p,g) between p and g (as defined earlier)
should be the minimum over all such choices for a1, a0, b1, and b0.
Sample Input
2
1.0 0.0 -0.2
0.0
3
1 0 -1 0
0.707
0
Output for the Sample InputCase 1: -1.000 -0.367 1.000 -0.367
Case 2: -0.499 -0.036 1.198 -1.236
数学题,求函数g(x)里的常数项a0,a1,b0,b1,使得函数d(p,g)取得最值。
在推导出极值条件后,需要实现多项式求值,多项式乘法和多项式定积分3个函数,便能解决问题。
400027 |
2009-04-24 05:49:39 |
Accepted |
0.002 |
Minimum |
19193 |
C++ |
4124 - Net Loss |
1 #include <iostream>
2 using namespace std;
3
4 const int MAXPOW = 20;
5 double a0,a1,b0,b1,A,B,C,D,E,F,G,H,I;
6 struct poly{
7 double c[MAXPOW];
8 double value(double x) const{ //多项式求值
9 double ans=0;
10 for(int i=MAXPOW-1;i>=0;i--)
11 ans=ans*x+c[i];
12 return ans;
13 }
14 poly operator * (const poly &p) const{ //多项式乘法
15 poly t;
16 for(int i=0;i<MAXPOW;i++)
17 for(int j=0;j<=i;j++)
18 t.c[i]+=p.c[i-j]*c[j];
19 return t;
20 }
21 double integral(double a,double b) const{//定积分
22 poly t;
23 for(int i=1;i<MAXPOW;i++)
24 t.c[i]=c[i-1]/i;
25 return t.value(b)-t.value(a);
26 }
27 void clear(){
28 memset(c,0,sizeof(c));
29 }
30 poly(){
31 memset(c,0,sizeof(c));
32 }
33 }p,q;
34 int main(){
35 double c;
36 int i,n,ca=1;
37 while(scanf("%d",&n),n){
38 p.clear();
39 for(i=n;i>=0;i--) scanf("%lf",&p.c[i]);
40 scanf("%lf",&c);
41 q.c[1]=1,q.c[0]=-c;
42 A=p.integral(-1,c) , B=q.integral(-1,c) , C=(p*q).integral(-1,c) , D=(q*q).integral(-1,c);
43 E=p.integral(c,1) , F=q.integral(c,1) , G=(p*q).integral(c,1) , H=(q*q).integral(c,1);
44 I=2*(A+E-B*C/D-F*G/H);
45 a1=(C-I*B)/D , a0=I-c*a1 , b1=(G-I*F)/H , b0=I-c*b1;
46 printf("Case %d: %.3lf %.3lf %.3lf %.3lf\n",ca++,a1,a0,b1,b0);
47 }
48 return 0;
49 }