Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/47: Рейтинг темы: голосов - 47, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 28.09.2016
Сообщений: 20
1

Метод простых итераций для решения нелинейных уравнений на Java

23.02.2019, 09:49. Показов 9601. Ответов 11
Метки нет (Все метки)

Пишу код. Вроде все ок, но ничего не работает, точнее работает, но не корректно. Использовала как пример код на с++. Может у кого есть данный метод реализованный на Java? Буду очень благодарна
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2019, 09:49
Ответы с готовыми решениями:

Метод простых итераций на Java
Необходим метод простых итераций на Java, везде на с++.

Метод Гаусса для решения системы уравнений. Перевести с Pascal
Прошу помощи. Нашёл код в интернете, попробовал написать его на java. Но дело в том, что массивы в...

Как реализовать метод простых итераций?
Вот у меня есть матрица? Нужно найти вектор x? Проблема в очень большом отклонении. Подскажите...

Решение нелинейных уравнений (метод Мюллера)
Помогите реализовать метод,требуется,чтобы на выходе был один корень. Очень нужно.Если нет,то...

11
Йуный падаван
Эксперт PythonЭксперт Java
8818 / 5219 / 1795
Регистрация: 21.10.2017
Сообщений: 14,036
23.02.2019, 10:45 2

Не по теме:

Цитата Сообщение от Katrin9999 Посмотреть сообщение
все ок, но ничего не работает
Отлично сказано!


Уравнение-то где?

Добавлено через 2 минуты
И на то, что получилось, любопытно поглядеть
0
1 / 1 / 0
Регистрация: 28.09.2016
Сообщений: 20
23.02.2019, 11:53  [ТС] 3
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Уравнение-то где?
x^3-3x^2+6x+3
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import static java.lang.Math.abs;
 
public class Number4 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        double x0, eps = 0.001, x;
        x0 = -0.7;
        x = func(x0);
        if (func(x0)<1){
            System.out.println("True");
        }
        while ((x-x0)<eps){
            x0=x;
            x = func(x0);
            System.out.println(x);
        }
    System.out.println(x);  
    }
    
    public static double func (double x){
        return x*x*x-3*x*x+7*x+3;
    }
    
}
0
2162 / 1701 / 428
Регистрация: 17.02.2014
Сообщений: 8,357
23.02.2019, 12:10 4
Katrin9999, тут может 3 корня)), На каких интервалах искать хочешь?
0
2162 / 1701 / 428
Регистрация: 17.02.2014
Сообщений: 8,357
23.02.2019, 12:13 5
и тут x-x0 нужно брать модуль
0
1 / 1 / 0
Регистрация: 28.09.2016
Сообщений: 20
23.02.2019, 12:14  [ТС] 6
Цитата Сообщение от Aviz__ Посмотреть сообщение
может 3 корня)), На каких интерв
Я знаю, что там 3 корня. Один "нормальный", другие комплексные. Нужен "нормальный". Интервал -5 до 5, хотя тут я не уверена. Получить надо ответ x = -0.40673828. Методы деления отрезка пополам, хорд и Ньютона работают, а этот никак не хочет
0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
23.02.2019, 12:52 7
x^3-3x^2+6x+3 - такую формулу Вы написали

а такую используете в коде:
x*x*x-3*x*x+7*x+3

где-то не стыковка (6 и 7)
0
1 / 1 / 0
Регистрация: 28.09.2016
Сообщений: 20
23.02.2019, 15:53  [ТС] 8
Это преобразование x=g(x)
0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
23.02.2019, 16:36 9
формула точно такая?

Добавлено через 1 минуту
потому что значения по этой формуле растут нереально быстро

Добавлено через 3 минуты
вот промежуточные выводы:

x = 3,11880800
x = 22,86848906
x = 10530,79078707
x = 1167506316825,33350000
x = 1591394002575421600000000000000000000,00000000
x = 403026080571162640000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000,00000000
x = Infinity
x = NaN

Добавлено через 9 минут
задание и формулу и интервал бы для решения знать.... Тогда смогу помочь
0
1 / 1 / 0
Регистрация: 28.09.2016
Сообщений: 20
23.02.2019, 17:18  [ТС] 10
Цитата Сообщение от ArtemFM Посмотреть сообщение
задание и формулу и интервал бы для решения знать.... Тогда смогу помочь
Решить с помощью метода простой итерации х^3-3x^2+6x+3=0 ; отрезок от -3 до 3
0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
24.02.2019, 02:52 11
Лучший ответ Сообщение было отмечено Katrin9999 как решение

Решение

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class MethodIteration {
    private static final int MIN_RANGE = -3;
    private static final int MAX_RANGE = 3;
    private static final double EPS = 0.0001;
 
    //Находим lambda и корень
    private static Pare getMax(double min, double max, double x1) {
        Pare pare = null;
        double a = 3 * Math.pow(min, 2) - 6 * min + 6;
        double b = 3 * Math.pow(max, 2) - 6 * max + 6;
        double c = 3 * Math.pow(x1, 2) - 6 * x1 + 6;
        if (a >= b && a >= c) {
            pare = new Pare(min , 1. / a);
        } else if (b >= a && b >= c) {
            pare = new Pare(max , 1. / b);
        } else {
            pare = new Pare(x1 , 1. / c);
        }
        return pare;
    }
 
    private static double function(double lamb, double x, double eps) {
        double x0;
        do {
            x0 = x;
            x = x - lamb * (Math.pow(x, 3) - 3 * Math.pow(x, 2) + 6 * x + 3);
        } while (Math.abs(x - x0) >= eps);
        return x;
    }
 
 
    public static void main(String[] args) {
        //дана функция х^3-3x^2+6x+3=0
        //y = 3x^2 - 6x + 6
        //y` = 6x - 6 = 0 =>
        //x1 = 1;
        Pare pare = getMax(MIN_RANGE, MAX_RANGE, 1);
        System.out.printf("Лямбда равна: %.5f;\n", pare.getLamda());
        System.out.printf("Начальный корень: %.2f;\n", pare.getSqr());
 
        //теперь полная формула равна:
        //x = x - lambda(х^3-3x^2+6x+3);
        double result = function(pare.getLamda(), pare.getSqr(), EPS);
        System.out.printf("Ответ:\n x = %.8f;", result);
 
    }
}
 
class Pare {
    private double sqr;
    private double lamda;
 
    public double getSqr() {
        return sqr;
    }
 
    public double getLamda() {
        return lamda;
    }
 
    Pare(double sqr, double lamda) {
        this.sqr = sqr;
        this.lamda = lamda;
    }
}
Добавлено через 48 минут
можно реализовать без дополнительного класса Pare:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class MethodIteration {
    private static final double MIN_RANGE = -3;
    private static final double MAX_RANGE = 3;
    private static final double EPS = 0.0001;
 
    /**
     * Метод находит начальное значение для х.
     * Как он работает? Мы подставляем в производную формулы
     * minRange, maxRange и x и выбираем fmax. (максимальный результат)
     *
     * @param minRange - минимальный корень для значения х;
     * @param maxRange - максимальный корень для значения х;
     * @param x        - корень, найденный из уравнения;
     * @return начальное значение для х для итерации
     */
    public static double searchX(double minRange, double maxRange, double x) {
        double a = 3 * Math.pow(minRange, 2) - 6 * minRange + 6;
        double b = 3 * Math.pow(maxRange, 2) - 6 * maxRange + 6;
        double c = 3 * Math.pow(x, 2) - 6 * x + 6;
        return a >= b && a >= c ? minRange : b >= a && b >= c ? maxRange : x;
    }
 
    /**
     * Т.к. конечная формула для итерации равна x - lambda * f(x),
     * то этим методом мы находим значение лямбды
     *
     * @param x - начальное найденное значение для итераций
     * @return лямбду
     */
    public static double getLambda(double x) {
        return 1. / (3 * Math.pow(x, 2) - 6 * x + 6);
    }
 
    /**
     * Ищем итерацией решение функции с погрешностью.
     *
     * @param lambda - лямбда;
     * @param x      - начальное значение х для итераций;
     * @param eps    - погрешность;
     * @return возвращаем решение
     */
    private static double function(double lambda, double x, double eps) {
        double x0;
        do {
            x0 = x;
            x = x - lambda * (Math.pow(x, 3) - 3 * Math.pow(x, 2) + 6 * x + 3);
        } while (Math.abs(x - x0) >= eps);
        return x;
    }
 
 
    public static void main(String[] args) {
        //дана функция y = х^3-3x^2+6x+3;
        //y` = 3x^2 - 6x + 6
        //y`` = 6x - 6 = 0
        //6x - 6 = 0;
        //x = 1;
        double x = 1;
        System.out.println("Дана функция:\n   y = x^3 - 3*x^2 + 6*x + 3;");
        System.out.printf("   На отрезке: [%.2f, %.2f];\n", MIN_RANGE, MAX_RANGE);
        System.out.printf("   Промежуточный корень: %.2f\n\n", x);
 
        x = searchX(MIN_RANGE, MAX_RANGE, x);
        double lambda = getLambda(x);
        System.out.printf("Начальный Х для итерации равен: %.2f;\n", x);
        System.out.printf("Лямбда равна: %.5f;\n", lambda);
 
        double result = function(lambda, x, EPS);
        System.out.printf("\nОтвет:\n   x = %.8f;", result);
    }
}
Добавлено через 53 минуты
и последняя реализация... Переделал некоторые недочёты и вывожу больше информации:
1. возвращать и метода function нужно не х, а х0 (я ошибся в прошлой реализации;
2. вывожу таблицу итераций для х и f(x);

P.S. ответ сверял с сайтом онлайн решения таких уравнений: https://math.semestr.ru/optim/iteration_method.php

Вот сам код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public class MethodIteration {
    private static final double MIN_RANGE = -3;
    private static final double MAX_RANGE = 3;
    private static final double EPS = 0.0001;
 
    /**
     * Метод находит начальное значение для х.
     * Как он работает? Мы подставляем в производную формулы
     * minRange, maxRange и x и выбираем fmax. (максимальный результат)
     *
     * @param minRange - минимальный корень для значения х;
     * @param maxRange - максимальный корень для значения х;
     * @param x        - корень, найденный из уравнения;
     * @return начальное значение для х для итерации
     */
    public static double searchX(double minRange, double maxRange, double x) {
        double a = 3 * Math.pow(minRange, 2) - 6 * minRange + 6;
        double b = 3 * Math.pow(maxRange, 2) - 6 * maxRange + 6;
        double c = 3 * Math.pow(x, 2) - 6 * x + 6;
        return a >= b && a >= c ? minRange : b >= a && b >= c ? maxRange : x;
    }
 
    /**
     * Т.к. конечная формула для итерации равна x - lambda * f(x),
     * то этим методом мы находим значение лямбды
     *
     * @param x - начальное найденное значение для итераций
     * @return лямбду
     */
    public static double getLambda(double x) {
        return 1. / (3 * Math.pow(x, 2) - 6 * x + 6);
    }
 
    /**
     * Ищем итерацией решение функции с погрешностью.
     *
     * @param lambda - лямбда;
     * @param x      - начальное значение х для итераций;
     * @param eps    - погрешность;
     * @return возвращаем решение
     */
    private static double function(double lambda, double x, double eps) {
        double x0;
        double fx;
        int count = 0;
        System.out.printf("%s %8s %15s\n", "Итераций", "x", "f(x)");
        do {
            x0 = x;
            x = x - lambda * (Math.pow(x, 3) - 3 * Math.pow(x, 2) + 6 * x + 3);
            fx = Math.pow(x0, 3) - 3 * Math.pow(x0, 2) + 6 * x0 + 3;
            System.out.printf("%5d %15.8f %15.8f\n", ++count, x0, fx);
        } while (Math.abs(x - x0) >= eps);
        return x0;
    }
 
 
    public static void main(String[] args) {
        //дана функция y = х^3-3x^2+6x+3;
        //y` = 3x^2 - 6x + 6
        //y`` = 6x - 6 = 0
        //6x - 6 = 0;
        //x = 1;
        double x = 1;
        System.out.println("Дана функция:\n   y = x^3 - 3*x^2 + 6*x + 3;");
        System.out.printf("   На отрезке: [%.2f, %.2f];\n", MIN_RANGE, MAX_RANGE);
        System.out.printf("   Промежуточный корень: %.2f\n\n", x);
 
        x = searchX(MIN_RANGE, MAX_RANGE, x);
        double lambda = getLambda(x);
        System.out.printf("Начальный Х для итерации равен: %.2f;\n", x);
        System.out.printf("Лямбда равна: %.5f;\n\n", lambda);
 
        double result = function(lambda, x, EPS);
        System.out.printf("\nОтвет:\n   x = %.8f;", result);
    }
}
Добавлено через 1 минуту
Вывод для eps = 0.0001:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Дана функция:
   y = x^3 - 3*x^2 + 6*x + 3;
   На отрезке: [-3,00, 3,00];
   Промежуточный корень: 1,00
 
Начальный Х для итерации равен: -3,00;
Лямбда равна: 0,01961;
 
Итераций        x            f(x)
    1     -3,00000000    -69,00000000
    2     -1,64705882    -19,48890698
    3     -1,26492339    -11,41355080
    4     -1,04112828     -7,62714296
    5     -0,89157646     -5,44290624
    6     -0,78485280     -4,04056316
    7     -0,70562608     -3,07881791
    8     -0,64525710     -2,38926988
    9     -0,59840867     -1,87901673
   10     -0,56156520     -1,49255031
   11     -0,53229951     -1,19464859
   12     -0,50887503     -0,96188667
   13     -0,49001451     -0,77808913
   14     -0,47475786     -0,63174026
   15     -0,46237079     -0,51443375
   16     -0,45228386     -0,41990469
   17     -0,44405043     -0,34340315
   18     -0,43731704     -0,28127600
   19     -0,43180182     -0,23068002
   20     -0,42727868     -0,18938033
   21     -0,42356534     -0,15560569
   22     -0,42051425     -0,12794268
   23     -0,41800557     -0,10525694
   24     -0,41594171     -0,08663380
   25     -0,41424301     -0,07133281
   26     -0,41284432     -0,05875262
   27     -0,41169231     -0,04840351
   28     -0,41074322     -0,03988581
   29     -0,40996115     -0,03287273
   30     -0,40931659     -0,02709664
   31     -0,40878528     -0,02233811
   32     -0,40834728     -0,01841704
   33     -0,40798616     -0,01518546
   34     -0,40768840     -0,01252175
   35     -0,40744288     -0,01032585
   36     -0,40724041     -0,00851541
   37     -0,40707344     -0,00702267
   38     -0,40693574     -0,00579177
   39     -0,40682218     -0,00477675
 
Ответ:
   x = -0,40682218;
Process finished with exit code 0
Добавлено через 3 минуты
Вывод для eps 0.001:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Дана функция:
   y = x^3 - 3*x^2 + 6*x + 3;
   На отрезке: [-3,00, 3,00];
   Промежуточный корень: 1,00
 
Начальный Х для итерации равен: -3,00;
Лямбда равна: 0,01961;
 
Итераций        x            f(x)
    1     -3,00000000    -69,00000000
    2     -1,64705882    -19,48890698
    3     -1,26492339    -11,41355080
    4     -1,04112828     -7,62714296
    5     -0,89157646     -5,44290624
    6     -0,78485280     -4,04056316
    7     -0,70562608     -3,07881791
    8     -0,64525710     -2,38926988
    9     -0,59840867     -1,87901673
   10     -0,56156520     -1,49255031
   11     -0,53229951     -1,19464859
   12     -0,50887503     -0,96188667
   13     -0,49001451     -0,77808913
   14     -0,47475786     -0,63174026
   15     -0,46237079     -0,51443375
   16     -0,45228386     -0,41990469
   17     -0,44405043     -0,34340315
   18     -0,43731704     -0,28127600
   19     -0,43180182     -0,23068002
   20     -0,42727868     -0,18938033
   21     -0,42356534     -0,15560569
   22     -0,42051425     -0,12794268
   23     -0,41800557     -0,10525694
   24     -0,41594171     -0,08663380
   25     -0,41424301     -0,07133281
   26     -0,41284432     -0,05875262
   27     -0,41169231     -0,04840351
 
Ответ:
   x = -0,41169231;
Process finished with exit code 0
1
1 / 1 / 0
Регистрация: 28.09.2016
Сообщений: 20
24.02.2019, 11:28  [ТС] 12
Спасибо
Цитата Сообщение от ArtemFM Посмотреть сообщение
Вывод для eps 0.001:
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2019, 11:28

Метод простых итераций для систем нелинейных уравнений
Народ, помогите плиз, необходимо решить систему нелинейных уравнений методом простых итераций:...

Метод Ньютона для решения нелинейных уравнений: узнать количество итераций
Задание: реализовать метод Ньютона для решения нелинейных уравнений, в итоге получить: значение...

Метод простых итераций для решения системы линейных уравнений
помогите найти ошибку в алгоритме при вводе уравнения x+y = 2 2x-y = 7 x = 2-y; y =...

Метод простых итераций нелинейных уравнений
Помогите довести код до ума. using System; using System.Collections.Generic; using System.Linq;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.