Форум программистов, компьютерный форум, киберфорум
Численные методы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/48: Рейтинг темы: голосов - 48, средняя оценка - 4.54
3 / 3 / 4
Регистрация: 28.11.2011
Сообщений: 35
1

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

23.02.2013, 21:29. Показов 9815. Ответов 5
Метки нет (Все метки)

Нужно решить такую систему :
sin(x + y) - 1.122*x = 0.498
x2 + y2 = 1
C методом я разобрался, алгоритм написал на С++, вот код, может кому захочется посмотреть :

Кликните здесь для просмотра всего текста
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>
 
using namespace std;
 
#define eps 0.00001
 
double function1(double x, double y)
{
    return sin(x + y) - 1.122*x - 0.498;
}
 
double function2(double x, double y)
{
    return x*x + y*y - 1;
}
 
double func11(double x, double y)
{
    return cos(x + y) - 1.122;
}
 
double func12(double x, double y)
{
    return cos(x + y);
}
 
double func21(double x, double y)
{
    return 2*x;
}
 
double func22(double x, double y)
{
    return 2*y;
}
 
void obr_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[1][0]/det;
    a[1][0] = -aa/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;
}
void main()
{
    double x, y;
    cout << "x = ";
    cin >> x ;
    cout << "y = ";
    cin >> y;
    nuton(x, y);
    cout << endl;
    system("PAUSE");
}

Код работает нормально, но проблема в том, что система имеет две пары решений, а прога всегда находит одно из них(то, что справа) хотя начальные X и Y я ввожу приблизительными ко второму корню(например -0,9 и 0,4 )
Это недостаток метода, что он всегда сходится к одному и тому же корню ? (и почему так ???)
Можно как-то это исправить? Помогите пожалуйста.

Вот еще график системы :
Миниатюры
Решение системы нелинейных уравнений методом ньютона  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2013, 21:29
Ответы с готовыми решениями:

Решение системы нелинейных уравнений методом Ньютона
sin(x+2)-y=1.5 x+cos(y-2)=0.5 решить методам Ньютона с погрешностью 0.0001. y=sin(x+2)-1.5...

Решение системы нелинейных уравнений методом Ньютона
Доброго всем времени суток. Необходимо решить систему нелинейных уравнений. Я выбрал метод Ньютона...

Решение системы нелинейных уравнений методом скорейшего спуска
Всем привет, решаю задачу для лабораторной работы, мне попалась система нелинейных уравнений под...

Решение системы нелинейных уравнений методом простой итерации
Подскажите пожалуйста как решать. Найти решение системы нелинейных уравнений методом простой...

5
Модератор
Эксперт по математике/физике
4189 / 3375 / 395
Регистрация: 15.06.2009
Сообщений: 5,768
23.02.2013, 22:11 2
Цитата Сообщение от nidaime Посмотреть сообщение
Это недостаток метода, что он всегда сходится к одному и тому же корню ?
Это недостаток конкретной реализации метода. Нужен не программный код (его здесь обсуждать не место), а исходные формулы, уравнения, которые в коде реализованы.

Не по теме:

Интересно, как это вообще могло работать? Строки 37, 59 в коде

1
3 / 3 / 4
Регистрация: 28.11.2011
Сообщений: 35
23.02.2013, 23:11  [ТС] 3
Ну словом есть у меня система, найдем матрицу Якоби, назовем ее А.
Дальше подставим в эту матрицу вместо x, y какое-то приблизительное их значение x0,y0
Вычислим следующие значения x, y по формуле:
(x, y) = (x0,y0) - A-1*F(x0,y0),
где F - вектор значений начальной системы, когда у нее подставить x0,y0.
Или
(xk+1, yk+1) = (xk,yk) - A-1(xk,yk)*F(xk,yk),
Ну и цикл продолжаем до тех пор, пока |xk+1-xk| > eps.
Вот отсюда читал про метод:
http://www.physchem.chimfak.rs... in_eq.html
Матрица Якоби:
Изображения
 
0
3 / 3 / 4
Регистрация: 28.11.2011
Сообщений: 35
23.02.2013, 23:33  [ТС] 4
Цитата Сообщение от Том Ардер Посмотреть сообщение
Интересно, как это вообще могло работать? Строки 37, 59 в коде
а почему оно не должно работать?
вроде все нормально.

Добавлено через 10 минут

Не по теме:

Цитата Сообщение от nidaime Посмотреть сообщение
а почему оно не должно работать?
вроде все нормально.
а, там конечно должно быть ober_matr(a)-строка 59
я наверняка стер букву нечаянно


ну так что по теме , есть идеи почему не находит второй корень ?
0
Модератор
Эксперт по математике/физике
4189 / 3375 / 395
Регистрация: 15.06.2009
Сообщений: 5,768
24.02.2013, 16:49 5
Цитата Сообщение от nidaime Посмотреть сообщение
почему не находит второй корень ?
Причина может быть в начальном приближении и условиях сходимости итераций (связаны со второй производной). При (x,y)=(1; 1) или даже (-1; -1) сходимость к первому корню (0.4; 0.9), а при начале с (-0.9; 0.4) или (-1; 0.4) быстро сходится ко второму корню (-0.936; 0.351). Проверить нужно правильность перевода формул в код, и сами формулы в первую очередь.

Хорошая книга: Л.Коллатц, Ю.Альбрехт "Задачи по прикладной математике", особенно гл.2 по теме.
1
FlyElf
13.07.2013, 17:19 6
Цитата Сообщение от nidaime Посмотреть сообщение
return cos(x + y);
'
Скорее всего, это должно быть так:
return -sin(x+y)
13.07.2013, 17:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2013, 17:19

Метод Ньютона для решения системы нелинейных уравнений
sin(x+2)-y=1.5 x+cos(y-2)=0.5 решить методам Ньютона с погрешностью 0.0001.За начальные...

Решение системы нелинейных уравнений
Здравствуйте, в книге &quot;Самоучитель - Алексеев Е., Чеснокова О. - Решение задач вычислительной...

Решение системы нелинейных уравнений с 5 неизвестными
Люди помогайте :) Кто как может естественно)) {{x}_{1}}^{2}+2{{x}_{2}}^{2}-19=0 \\...

Аналитическое решение системы нелинейных уравнений
Добрый день. Не могу решить аналитически систему нелинейных уравнений и построить рабочие формулы...


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

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

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