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;
}