Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 21.05.2018
Сообщений: 1
1

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

21.05.2018, 20:23. Показов 3272. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.В общем, нужно решить систему нелинейных уравнений методом ньютона:
sin(x - 1) - 1.3 + y
x - sin(y + 1) - 0.8
Мною на просторах интернета была найдена вот такая програмка
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
void __fastcall TForm1::Button2Click(TObject* Sender)
{
    x = StrToFloat(Edit1->Text);
    y = StrToFloat(Edit2->Text);
    z = StrToFloat(Edit3->Text);
    esp = StrToFloat(Edit4->Text);
    double a[n][n], a1[n][n], b[n], det, invdet, f[n],
           K[n]; //a[3][3]-матрица Якоби;
    //a1[3][3]-обратная матрица; b[3]-произведение а1[3] на f[3]; f[3]-массив функций; K[3]-массив переменных
    double xk, yk, zk, xn, yn, zn,
           max; //изменение значения переменных при k=0,1,2..
    int k = 0; //кол-во итераций
    //Матрица Якоби
    {
        a[0][0] = (-2 * x - 1);
        a[0][1] = (2 * z);
        a[0][2] = (2 * y);
        a[1][0] = (-3 * z);
        a[1][1] = (2 * y - 1);
        a[1][2] = (-3 * x);
        a[2][0] = (-2 * y);
        a[2][1] = (-2 * x);
        a[2][2] = (-2 * z - 1);
        //Определитель
        det = a[0][0] * a[1][1] * a[2][2] + a[0][1] * a[1][2] * a[2][0] +
              a[0][2] * a[1][0] * a[2][1] -
              a[0][2] * a[1][1] * a[2][0] - a[0][0] * a[1][2] * a[2][1] - a[0][1] *
              a[1][0] * a[2][2];
        invdet = 1 / det;
 
        //Обратная матрица
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                a1[0][0] =  a[1][1] * a[2][2] - a[1][2] * a[2][1] * invdet;
                a1[0][1] = -a[1][0] * a[2][2] + a[2][0] * a[1][2] * invdet;
                a1[0][2] =  a[1][0] * a[2][1] - a[1][1] * a[2][0] * invdet;
                a1[1][0] = -a[0][1] * a[2][2] + a[0][2] * a[2][1] * invdet;
                a1[1][1] =  a[0][0] * a[2][2] - a[0][2] * a[2][0] * invdet;
                a1[1][2] = -a[0][0] * a[2][1] + a[0][1] * a[2][0] * invdet;
                a1[2][0] =  a[0][1] * a[1][2] - a[0][1] * a[1][1] * invdet;
                a1[2][1] = -a[0][0] * a[1][2] + a[0][2] * a[2][0] * invdet;
                a1[2][2] =  a[0][0] * a[1][1] - a[0][1] * a[1][0] * invdet;
            }
        }
 
        //Массив функций
        for (j = 0; j < n; j++)
        {
            f[0] = f1(x, y, z);
            f[1] = f2(x, y, z);
            f[2] = f3(x, y, z);
        }
 
        //Массив переменных
        for (j = 0; j < n; j++)
        {
            K[0] = x;
            K[1] = y;
            K[2] = z;
        }
 
        do {
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    b[0] = a[0][0] * f[0] + a[0][1] * f[1] + a[0][2] * f[2];
                    b[1] = a[1][0] * f[0] + a[1][1] * f[1] + a[1][2] * f[2];
                    b[2] = a[2][0] * f[0] + a[2][1] * f[1] + a[2][2] * f[2];
                }
            }
 
            xk = K[0] - b[0];
            yk = K[1] - b[1];
            zk = K[2] - b[2];
            xn = xk - x;
            yn = yk - y;
            zn = zk - z;
            {
                if (abs(xn) > abs(yn))
                {
                    if (abs(xn) > abs(zn))
                    {
                        max = xn;
                    }
                    else
                    {
                        max = zn;
                    }
                }
                else
                {
                    if (abs(yn) > abs(zn))
                    {
                        max = yn;
                    }
                    else
                    {
                        max = zn;
                    }
                }
            }
            x = xk;
            y = yk;
            z = zk;
        } while (abs(max) >= esp);
 
        k++;
        Edit5->Text = FloatToStr(xk);
        Edit6->Text = FloatToStr(yk);
        Edit7->Text = FloatToStr(zk);
        Edit8->Text = FloatToStr(k);
    }
}
И я попытался её переделать под себя и вот какой у меня вышел "неработающий мутант"
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <cmath>
using namespace std;
double f1(double x, double y)
{
    return sin(x - 1) - 1.3 + y;
}
 
double f2(double x, double y)
{
    return x - sin(y + 1) - 0.8;
}
 
int n;
    double eps=0,001 a[2][2], a1[2][2], b[n], det, invdet, f[n],
           K[n]; //a[2][2]-матрица Якоби;
    //a1[2][2]-обратная матрица; b[2]-произведение а1[2] на f[2]; f[2]-массив функций; K[2]-массив переменных
    double xk, yk,xn, yn
           max; //изменение значения переменных при k=0,1,2..
    int k = 0; //кол-во итераций
    //Матрица Якоби
    {
        a[0][0] = cos(x-1);
        a[0][1] = 1;
        a[1][0] = 1;
        a[1][1] = -cos(y+1);
        //Определитель
        det = a[0][0] * a[1][1] - a[0][1] * a[1][1];
 
        invdet = 1 / det;
 
        //Обратная матрица
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                a1[0][0] =  a[1][1] * invdet;
                a1[0][1] = -a[1][0] * invdet;
                a1[1][0] = -a[0][1] * invdet;
                a1[1][1] =  a[0][0] * invdet;
            }
        }
 
        //Массив функций
        for (j = 0; j < n; j++)
        {
            f[0] = f1(x, y);
            f[1] = f2(x, y);
        }
 
        //Массив переменных
        for (j = 0; j < n; j++)
        {
            K[0] = x;
            K[1] = y;
        }
 
        do {
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    b[0] = a[0][0] * f[0] + a[0][1] * f[1] + a[0][2] * f[2];
                    b[1] = a[1][0] * f[0] + a[1][1] * f[1] + a[1][2] * f[2];
                }
            }
 
            xk = K[0] - b[0];
            yk = K[1] - b[1];
            xn = xk - x;
            yn = yk - y;
            {
                if (abs(xn) > abs(yn))
                {
                    if (abs(xn) > abs(zn))
                    {
                        max = xn;
                    }
                    else
                    {
                        max = zn;
                    }
                }
                else
                {
                    if (abs(yn) > abs(zn))
                    {
                        max = yn;
                    }
                    else
                    {
                        max = zn;
                    }
                }
            }
            x = xk;
            y = yk;
        } while (abs(max) >= esp);
 
        k++;
        Edit5->Text = FloatToStr(xk);
        Edit6->Text = FloatToStr(yk);
        Edit7->Text = FloatToStr(zk);
        Edit8->Text = FloatToStr(k);
    }
}
В общем,что делать мне с ней?Заранее благодарю за помощь.

Добавлено через 11 минут
Забыл пояснить,что программа должна быть на C++
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2018, 20:23
Ответы с готовыми решениями:

Решение системы нелинейных уравнений методом Ньютона (С/С++)
Здравствуйте! Помогите пожалуйста написать программу :cry: У меня есть система из 2х уравнений...

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

Решение системы нелинейных уравнений методом Ньютона и итераций
Привет. Нужно решить снар на вчера. Гуглить пытался, но чёт не хватает навыков для использование...

Решение системы нелинейных уравнений методами Ньютона и простых итераций
Написать программу решения системы нелинейных уравнений {y^3-x^2=1; ...

1
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
21.05.2018, 20:36 2
Цитата Сообщение от TrunTrun Посмотреть сообщение
на просторах интернета
А я это нашел:
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Метод_Ньютона.cpp: определяет точку входа для консольного приложения
 
#include "stdafx.h"
 
#include <iostream>
 
using namespace std;
 
float f(double x) //возвращает значение функции f(x) = x^2-2
 
{
 
       return x*x-2;
 
}
 
float df(float x) //возвращает значение производной
 
{
 
       return 2*x;
 
}
 
float d2f(float x) // значение второй производной
 
{
 
       return 2;
 
}
 
int _tmain(int argc, _TCHAR* argv[])
 
{
 
       int exit = 0, i=0;//переменные для выхода и цикла
 
       double x0,xn;// вычисляемые приближения для корня
 
       double a, b, eps;// границы отрезка и необходимая точность
 
             do {
 
                    i=0;
 
                    cout<<"Please input [a;b]\n=>";
 
                    cin>>a>>b; // вводим границы отрезка, на котором будем искать корень
 
                    cout<<"\nPlease input epsilon\n=>";
 
                    cin>>eps; // вводим нужную точность вычислений
 
                    if (a > b) // если пользователь перепутал границы отрезка, меняем их местами
 
                           {
 
                                  x0 = a;
 
                                  a = b;
 
                                  b = x0;
 
                           }
 
                    if (f(a)*f(b)>0) // если знаки функции на краях отрезка одинаковые, то здесь нет корня
 
                                  cout<<"\nError! No roots in this interval\n";
 
                           else
 
                           {
 
                           if (f(a)*d2f(a)>0) x0  = a; // для выбора начальной точки проверяем f(x0)*d2f(x0)>0 ?
 
                                  else x0 = b;
 
                           xn = x0-f(x0)/df(x0); // считаем первое приближение
 
                           cout<<++i<<"-th iteration = "<<xn<<"\n";
 
                           while(fabs(x0-xn) > eps) // пока не достигнем необходимой точности, будет продолжать вычислять
 
                           {
 
                                  x0 = xn;
 
                                  xn = x0-f(x0)/df(x0); // непосредственно формула Ньютона
 
                                  cout<<++i<<"-th iteration = "<<xn<<"\n";
 
                           }
 
                    cout<<"\nRoot = "<<xn; // вывод вычисленного корня
 
                    }
 
                    cout<<"\nExit?=>";
 
                    cin>>exit;
 
             } while (exit!=1); // пока пользователь не ввел exit = 1
 
       return 0;
 
}
ссылка, если можно её добавить будет: http://statistica.ru/branches-... neniy/#s3b
0
21.05.2018, 20:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2018, 20:36
Помогаю со студенческими работами здесь

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

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

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

Метод Ньютона для решения системы нелинейных уравнений
Программа работает неверно. Пожалуйста, помогите найти ошибки. Спасибо. #include &lt;iostream&gt;...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru