метод экстремума функции в java - PullRequest
0 голосов
/ 01 мая 2020

Я решил вычислить экстремумы функции по методу Фибоначчи, я новичок, я столкнулся с некоторыми ошибками в коде, если не трудно помочь правильно написать код для определения минимального и максимального выходных значений -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;
     }

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Заменить

int[] f = new int[j];

на

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
1 голос
/ 01 мая 2020

Смесь двойной и целочисленной арифметики c выглядит подозрительно. В частности, (f[i-2]/f[i]) означает целочисленное деление, см. Java Спецификации языка и виртуальной машины, 15.17. Мультипликативные операторы . Это означает, что результат округляется в меньшую сторону.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...