0 / 0 / 0
Регистрация: 21.05.2018
Сообщений: 1
|
|
1
|
Решение системы нелинейных уравнений методом ньютона
21.05.2018, 20:23. Показов 3272. Ответов 1
Доброго времени суток.В общем, нужно решить систему нелинейных уравнений методом ньютона:
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
|