0 / 0 / 0
Регистрация: 31.03.2018
Сообщений: 17
1

Метод Ньютона для решения системы нелинейных уравнений

01.04.2018, 10:52. Показов 13947. Ответов 10
Метки нет (Все метки)

Программа работает неверно. Пожалуйста, помогите найти ошибки. Спасибо.
C++
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
77
78
79
80
81
82
#include <iostream>
#include <math.h>
using namespace std;
 
#define eps 0.0001
 
double function1(double x, double y)
{
    return x*log(x)+y*(log(y))-1;
}
 
double function2(double x, double y)
{
    return pow(x,1/3)+pow(y,1/3)-2;
}
 
double func11(double x, double y)
{
    return log(x)+1;
}
 
double func12(double x, double y)
{
    return log(y)+1;
}
 
double func21(double x, double y)
{
    return 1/(3*pow(x,2/3));
}
 
double func22(double x, double y)
{
    return 1/(3*pow(y,2/3));
}
 
void ober_matr(double a[2][2])
{
    double det, aa;
    det = a[0][0]*a[1][1] - a[0][1]*a[1][0];
    aa = a[0][0];
    a[0][0] = a[1][1]/det;
    a[1][1] = aa/det;
    aa = a[0][1];
    a[0][1] = -a[0][1]/det;
    a[1][0] = -a[1][0]/det;
}
 
void nuton(double x, double y)
{
    int i = 1;
    double a[2][2], dx, dy, b[2], norm;
    do
    {
        a[0][0] = func11(x, y);
        a[0][1] = func12(x, y);
        a[1][0] = func21(x, y);
        a[1][1] = func22(x, y);
        ober_matr(a);
        dx = -a[0][0]*function1(x, y) + -a[0][1]*function2(x, y);
        dy = -a[1][0]*function1(x, y) + -a[1][1]*function2(x, y);
        x = x + dx;
        y = y + dy;
        b[0] = function1(x, y);
        b[1] = function2(x, y);
        norm = sqrt(b[0]*b[0]+b[1]*b[1]);
        i++;
    }
    while (norm >= eps);
cout << x << endl << y << endl;
}
int main()
{
    double x, y;
    cout << "x = ";
    cin >> x ;
    cout << "y = ";
    cin >> y;
    nuton(x, y);
    cout << endl;
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2018, 10:52
Ответы с готовыми решениями:

Метод Ньютона для решения системы нелинейных уравнений
Здравствуйте! Нужно решить методом Ньютона систему уравнений с точностью 0.0001: sin(x+y) - 1.2x =...

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

Исправить код метод Ньютона для решения систем нелинейных уравнений под нужное условие
Данный код для решения системы ax+tg(xy)=0; (y^2-b^2)+lnx=0 Перепишите его,пожалуйста для...

Метод хорд для решения системы нелинейных уравнений
Здравствуйте, задал вопрос по чисмету вот тут...

10
3888 / 2813 / 651
Регистрация: 08.06.2007
Сообщений: 9,569
Записей в блоге: 4
01.04.2018, 14:58 2
Ошибка одна. Вы применяете в плавающих вычислениях целые константы. Припишите к ним ко всем нулевую дробную часть .0 и должно заработать. Правда, эта ошибка сказывается только на делении 1/3, 2/3.
Ну и уравнение с плохой сходимостью. Два решения могут быть получены, если брать начальную точку достаточно близко к решению. Например x=1.5, y=0.5 или для нахождения симметричного решения x=0.5, y=1.5. Если взять плохое начальное условие, то можете сразу улететь в область отрицательных переменных, где функции не определены.
1
0 / 0 / 0
Регистрация: 31.03.2018
Сообщений: 17
01.04.2018, 15:42  [ТС] 3
Спасибо, а как можно исправить сходимость?
0
3888 / 2813 / 651
Регистрация: 08.06.2007
Сообщений: 9,569
Записей в блоге: 4
01.04.2018, 15:51 4
Лучший ответ Сообщение было отмечено vladik7707 как решение

Решение

Программно никак. Метод запрограммирован правильно, но он не всегда сходится, есть соответствующие теоремы о сходимости метода. Можно применить какой-то другой метод, можно дополнительно исследовать систему уравнений и найти область начальных точек, которые дают сходимость. Но это наверно будет труднее, чем решить само уравнение.
0
0 / 0 / 0
Регистрация: 31.03.2018
Сообщений: 17
01.04.2018, 16:30  [ТС] 5
Мне кажется, что он неправильно находит Y. Судя по пересечению этих графиков,Y должен быть больше.

Добавлено через 19 минут
Вы можете проверить мой алгоритм?
0
642 / 449 / 209
Регистрация: 06.09.2013
Сообщений: 1,240
01.04.2018, 16:34 6
Цитата Сообщение от vladik7707 Посмотреть сообщение
а как можно исправить сходимость?
мне кажется, что сходимость чуть-чуть улучшится, если ввести замену
https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{matrix}x = e^u\\ y = e^v\end{matrix}
и решать систему относительно новых переменных,
по крайней мере они не будут вылетать из области определения функции
0
0 / 0 / 0
Регистрация: 31.03.2018
Сообщений: 17
01.04.2018, 16:37  [ТС] 7
я вас не понял. Что это за степень?Спасибо.
0
642 / 449 / 209
Регистрация: 06.09.2013
Сообщений: 1,240
01.04.2018, 16:56 8
Цитата Сообщение от vladik7707 Посмотреть сообщение
я вас не понял. Что это за степень?Спасибо.
Ну замена переменных, просто. Подставить во все функции и продифференцировать заново.
Вроде как я переделал ваш метод и получается, что да чуть лучше сходится, если я нигде не ошибся.
Кликните здесь для просмотра всего текста


C++
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
77
78
79
80
81
82
83
84
#include <iostream>
#include <math.h>
using namespace std;
 
#define eps 0.0001
 
double function1(double x, double y)
{
    return x*exp(x)+y*exp(y)-1;
}
 
double function2(double x, double y)
{
    return exp(x/3.0)+exp(y/3.0)-2;
}
 
double func11(double x, double y)
{
    return x * exp(x)+ exp(x);
}
 
double func12(double x, double y)
{
    return y * exp(y) + exp(y);
}
 
double func21(double x, double y)
{
    return 1.0 /3.0 * exp(x/3.0);
}
 
double func22(double x, double y)
{
    return 1.0 /3.0 * exp(y/3.0);
}
 
 
 
void ober_matr(double a[2][2])
{
    double det, aa;
    det = a[0][0]*a[1][1] - a[0][1]*a[1][0];
    aa = a[0][0];
    a[0][0] = a[1][1]/det;
    a[1][1] = aa/det;
    aa = a[0][1];
    a[0][1] = -a[0][1]/det;
    a[1][0] = -a[1][0]/det;
}
 
void nuton(double x, double y)
{
    int i = 1;
    double a[2][2], dx, dy, b[2], norm;
    do
    {
        a[0][0] = func11(x, y);
        a[0][1] = func12(x, y);
        a[1][0] = func21(x, y);
        a[1][1] = func22(x, y);
        ober_matr(a);
        b[0] = function1(x, y);
        b[1] = function2(x, y);
        dx = a[0][0]*b[0] + a[0][1]*b[1];
        dy = a[1][0]*b[0] + a[1][1]*b[1];
        x = x - dx;
        y = y - dy;
        norm = sqrt(b[0]*b[0]+b[1]*b[1]);
        i++;
    }
    while (norm >= eps);
    cout << exp(x) << endl << exp(y) << endl;
}
int main()
{
    double x, y;
    cout << "x = ";
    cin >> x ;
    cout << "y = ";
    cin >> y;
    nuton(log(x), log(y));
    cout << endl;
    return 0;
}
1
0 / 0 / 0
Регистрация: 31.03.2018
Сообщений: 17
01.04.2018, 17:03  [ТС] 9
да, я вас понял. Работать стало лучше, но все же мне кажется, что где-то напутал с Y.
0
3888 / 2813 / 651
Регистрация: 08.06.2007
Сообщений: 9,569
Записей в блоге: 4
01.04.2018, 17:05 10
Лучший ответ Сообщение было отмечено vladik7707 как решение

Решение

Цитата Сообщение от vladik7707 Посмотреть сообщение
Мне кажется, что он неправильно находит Y. Судя по пересечению этих графиков,Y должен быть больше.
Я запустил программу, задал хорошие начальные условия, программа дала ответ x=1.98777 y=0.409577
Уравнения удовлетворяются. Проверьте сами. Я проверял на MATLAB.
Цитата Сообщение от vladik7707 Посмотреть сообщение
Вы можете проверить мой алгоритм?
Ну так я же проверял и написал, что запрограммировано правильно. Если у вас считает неправильно, то могу выложить мой вариант. Может быть я автоматически поправил еще какую-нибудь ошибку и забыл.
1
0 / 0 / 0
Регистрация: 31.03.2018
Сообщений: 17
01.04.2018, 17:06  [ТС] 11
а, я получал эти же значения. просто смотрел по графикам и мне казалось это неправильным. Большое спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2018, 17:06
Помогаю со студенческими работами здесь

Исследовать итерационный метод- метод касательных для решения нелинейных уравнений
прочитал много всего , но сам пример реализовать никак не могу , кто может помогите F(x) =...

Метод деления отрезка пополам для решения нелинейных уравнений (метод дихотомии)
Здравствуйте. Помогите пожалуйста дописать программу. Вот что вымучал, но на сдаче завалили, типо...

Написать программу для решения системы нелинейных уравнений
Не могу сделать прогу на С++. Кто сделает - огромное спасибо. sin(9x)+cos(7y)-5z*z=10,...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru