Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
- //Обратная матрица
- 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;
- }
- }
Add Comment
Please, Sign In to add comment