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

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

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

Студворк — интернет-сервис помощи студентам
Пишу код. Вроде все ок, но ничего не работает, точнее работает, но не корректно. Использовала как пример код на с++. Может у кого есть данный метод реализованный на Java? Буду очень благодарна
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2019, 09:49
Ответы с готовыми решениями:

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

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

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

11
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
23.02.2019, 10:45

Не по теме:

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


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

Добавлено через 2 минуты
И на то, что получилось, любопытно поглядеть
0
1 / 1 / 0
Регистрация: 28.09.2016
Сообщений: 20
23.02.2019, 11:53  [ТС]
Цитата Сообщение от 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
 Аватар для Aviz__
2740 / 2049 / 507
Регистрация: 17.02.2014
Сообщений: 9,470
23.02.2019, 12:10
Katrin9999, тут может 3 корня)), На каких интервалах искать хочешь?
0
 Аватар для Aviz__
2740 / 2049 / 507
Регистрация: 17.02.2014
Сообщений: 9,470
23.02.2019, 12:13
и тут x-x0 нужно брать модуль
0
1 / 1 / 0
Регистрация: 28.09.2016
Сообщений: 20
23.02.2019, 12:14  [ТС]
Цитата Сообщение от Aviz__ Посмотреть сообщение
может 3 корня)), На каких интерв
Я знаю, что там 3 корня. Один "нормальный", другие комплексные. Нужен "нормальный". Интервал -5 до 5, хотя тут я не уверена. Получить надо ответ x = -0.40673828. Методы деления отрезка пополам, хорд и Ньютона работают, а этот никак не хочет
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
23.02.2019, 12:52
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  [ТС]
Это преобразование x=g(x)
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
23.02.2019, 16:36
формула точно такая?

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

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

x = 3,11880800
x = 22,86848906
x = 10530,79078707
x = 1167506316825,33350000
x = 1591394002575421600000000000000000000,00 000000
x = 4030260805711626400000000000000000000000 0000000000000000000000000000000000000000 00000000000000000000000000000,00000000
x = Infinity
x = NaN

Добавлено через 9 минут
задание и формулу и интервал бы для решения знать.... Тогда смогу помочь
0
1 / 1 / 0
Регистрация: 28.09.2016
Сообщений: 20
23.02.2019, 17:18  [ТС]
Цитата Сообщение от ArtemFM Посмотреть сообщение
задание и формулу и интервал бы для решения знать.... Тогда смогу помочь
Решить с помощью метода простой итерации х^3-3x^2+6x+3=0 ; отрезок от -3 до 3
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
24.02.2019, 02:52
Лучший ответ Сообщение было отмечено 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  [ТС]
Спасибо
Цитата Сообщение от ArtemFM Посмотреть сообщение
Вывод для eps 0.001:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2019, 11:28
Помогаю со студенческими работами здесь

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

Метод простых итераций для систем нелинейных уравнений
Народ, помогите плиз, необходимо решить систему нелинейных уравнений методом простых итераций: (x-3)^2+(y+4)^2=9 -13x+4y=12 Вот то...

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru