2012-05-05 20:43:13Morris

[UVA][牛頓法] 10341 - Solve It

Problem F

Solve It

Input: standard input

Output: standard output

Time Limit: 1 second

Memory Limit: 32 MB

Solve the equation:
        p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0
        where 0 <= x <= 1.

Input

Input consists of multiple test cases and terminated by an EOF. Each test case consists of 6 integers in a single line: p, q, r, s, t and u (where 0 <= p,r <= 20 and -20 <= q,s,t <= 0). There will be maximum 2100 lines in the input file.

Output

For each set of input, there should be a line containing the value of x, correct upto 4 decimal places, or the string "No solution", whichever is applicable.

Sample Input

0 0 0 0 -2 1
1 0 0 0 -1 2
1 -1 1 -1 -1 1

Sample Output

0.7071
No solution
0.7554

為了一個牛頓法, 吃了好多 WA


#include <stdio.h>
#include <math.h>
#define eps 1e-6

int p, q, r, s, t, u;
double calc1(double xn) {
return p*exp(-xn) + q*sin(xn) + r*cos(xn) + s*tan(xn) + t*xn*xn + u;
}
double calc2(double xn) {
return -p*exp(-xn) + q*cos(xn) - r*sin(xn) + s/cos(xn)/cos(xn) + t*2*xn;
}
int main() {
while(scanf("%d %d %d %d %d %d", &p, &q, &r, &s, &t, &u) == 6) {
if(calc1(1)*calc1(0) > 0) {
puts("No solution");
continue;
}
if(fabs(calc1(0)) < eps) {
puts("0.0000");
continue;
}
if(fabs(calc1(1)) < eps) {
puts("1.0000");
continue;
}
double xn = 1, fx;
while(1) {
fx = calc1(xn);
if(fabs(fx) < eps) {
break;
}
xn = xn - fx/calc2(xn);
}
printf("%.4lf\n", xn);
}
return 0;
}