我有一个非线性方程式,定义为:p^(n-1)* [1-(1-p)^n] * r - c = 0
n
,r
,,>c>
。 我想在C方案拟订语言中解决p
的问题,并决定使用纽顿语方法。 我想知道,这是否是最合适的办法,是否有其他办法解决这一问题。 (一个重要的注是,此刻有概率,因此从0到1!)
这里是我目前的执行情况,看来对一些测试案例的工作是失败的:
#include <stdio.h>
#include <math.h>
#define ld long double
#define TOLERANCE 1e-7
#define ITERATIONS 1000
ld function(ld p, int n, int c, int r) {
return pow(p, n - 1) * (1 - pow(1 - p, n)) * r - c;
}
ld derivative(ld p, int n, int r) {
return r * (n - 1) * pow(p, n - 2) * (1 - pow(1 - p, n)) + r * n * pow(p, n - 1) * pow(1 - p, n - 1);
}
ld pFinder(int n, ld c, ld r) {
ld p = 0.5;
if (n == 0) {
return 0;
}
for (int i = 0; i < ITERATIONS; i++) {
ld fValue = function(p, n, c, r);
ld fPrime = derivative(p, n, r);
p = p - fValue / fPrime;
if (fabs(fValue) < TOLERANCE) {
return p;
}
}
printf("Didn t converge after %d iterations", ITERATIONS);
return -1;
}
int main() {
int n, c, r;
scanf("%d %d %d", &n, &c, &r);
ld p = pFinder(n, c, r);
printf("%.15Lf
", p);
return 0;
}
产生这一问题的是如下投入:18 30 2
,其结果为1.99936414839
,该编码不在<代码>[0, 1]的有效范围之内。 我不理解为什么发生这种情况。
这些制约因素包括:1 <=n <= 20
,1 <=10000
,1 <= 10000
,p
的绝对错误可上10^-6
。
我赞赏对可能错失的东西以及如何改进我的法典的任何见解。
P.S.是我第一次在这里做一些事情,我很抱着新意 co,因此,我希望你不要忘记,我不会在Markdown syntax上ficient。