我有一个公共双重方法:bisectie有2个双参数,当我在一个范围内随机使用这些参数时,我有一些错误我无法处理它们。
"Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
at java.util.Random.nextInt(Unknown Source)
at BisectieOptimizata.bisectie(BisectieOptimizata.java:23)
at BisectieOptimizata.main(BisectieOptimizata.java:39) "
以下是源代码:
import java.util.Random;
public class BisectieOptimizata {
public double c;
public double eps = 0.01;
//test function
public double functie(double x){
return x*x - 2*x + 1;
}
//derivata
public double derivata(double x){
return (functie(x+eps)-functie(x))/eps;
}
//bisection algh.
public double bisectie(double a, double b){
Random rand = new Random();
double err = 0.001;
while(Math.abs(b-a)>err){
c = rand.nextInt((int)((b - a) + 1)) + a + rand.nextDouble(); // random a number from a range, ex: [-10;11), I random 4.542
if(derivata(c)<0){
if(derivata(c)<a) a = c-a;
else a = c;
}else {
if(derivata(c)>b) b = c-b;
else b = c;
}
}
return (a+b)/2;
}
public static void main(String[] args){
BisectieOptimizata BO = new BisectieOptimizata();
System.out.println(BO.bisectie(-10, 10)); // a = -10, b = 10
}
}
答案 0 :(得分:1)
我发现你正在比较(Math.abs(b - a)&gt; err)所以负数可以 也是大于0.001,因为它是Math.abs。
这会导致你在rand.nextInt()中的值变为负值。
a和b的值在程序中改变如下
10.0
-10.0
10.0
-2.5993084021357675
0.1896164396715161
-2.5993084021357675
0.1896164396715161
1.5161487751844813 ---> error
这里(a-b)+1 = -0.32653233551。现在,Math.abs(b - a)值为1.32653233551,这显然符合循环标准。
但是当值(a-b)+1传递给rand.nextInt()时,它会产生一个异常,因为数字为负数。
我不确定你在使用算法做什么,但删除Math.abs确实解决了这个问题。
答案 1 :(得分:0)
该例外提供了有意义的信息:
"Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
at java.util.Random.nextInt(Unknown Source)
at BisectieOptimizata.bisectie(BisectieOptimizata.java:23)
at BisectieOptimizata.main(BisectieOptimizata.java:39) "
那么,您是否确保nextInt
的参数在您的代码中使用它的任何地方都是正面的?看来不是。
rand.nextInt((int)((b - a) + 1)) + a + rand.nextDouble();
也许你忘了在这里表演Math.abs
?没有更多信息,很难知道。在IDE中调试此问题很容易。您可以设置一个“例外断点”&#39;在Intellij中,在抛出此异常的位置捕获程序,并检查内存中可用的调用堆栈和变量。
或者只需在致电nextInt
之前添加此打印声明:
System.out.println((int)((b - a) + 1));
并且您注意到只有当表达式的值为负时才会失败。