我决定通过Fibonacci方法计算函数的极值,我是一个初学者,我在代码中遇到了一些错误,如果不难帮助正确地编写代码来确定最小值和最大值,那么输出- 2,借助黄金分割计算结果,结果为1.55。
public class Fibonacci {
double func(double x){
return Math.pow(x,3)-26*x+6*Math.pow(x, 2)-9;
}
double findMininFibonacci(double range_min_0, double range_min_1, double eps_min){
double x1, x2;
double N;
int j=10;
int[] f = new int[j];
f[0] = 1;
f[1] = 1;
f[3] = 2;
f[4] = 3;
double h_min;
double x3;
double x4;
while ((range_min_1-range_min_0)>eps_min){
for (int i = 4; i < j; ++i) {
N = (range_min_1-range_min_0)/eps_min;
f[i] = f[i - 1] + f[i - 2];
x1 = range_min_0 + (f[i-2]/f[i])*(range_min_1-range_min_0);
x2 = range_min_0 + (f[i-1]/f[i])*(range_min_1-range_min_0);
if(func(x1)<=func(x2)) {
range_min_1 = x2;
x2 = x1;
x1 = range_min_0 + (f[i-3]/f[i-1])*(range_min_1-range_min_0);
} else {
range_min_0 = x1;
x1 = x2;
x2 = range_min_0 + (f[i-2]/f[i-1])*(range_min_1-range_min_0);}
}
}
return (range_min_0 + range_min_1) / 2;
}
双精度和整数运算的混合看起来很可疑。具体而言,(f[i-2]/f[i])
表示整数除法,请参阅Java Language and Virtual Machine Specifications, 15.17. Multiplicative Operators。这意味着结果将四舍五入。
替换
int[] f = new int[j];
with
double[] f = new double[j];
[整数除法截断小数部分,例如]
public class Main {
public static void main(String[] args) {
int x = 3, y = 4;
System.out.println(x / y);
}
}
输出,
0
而
public class Main {
public static void main(String[] args) {
double x = 3, y = 4;
System.out.println(x / y);
}
}
输出,
0.75