Guest User

Untitled

a guest
May 6th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.35 KB | None | 0 0
  1. void __fastcall TForm1::Button2Click(TObject* Sender)
  2. {
  3. x = StrToFloat(Edit1->Text);
  4. y = StrToFloat(Edit2->Text);
  5. z = StrToFloat(Edit3->Text);
  6. esp = StrToFloat(Edit4->Text);
  7. double a[n][n], a1[n][n], b[n], det, invdet, f[n],
  8. K[n]; //a[3][3]-матрица Якоби;
  9. //a1[3][3]-обратная матрица; b[3]-произведение а1[3] на f[3]; f[3]-массив функций; K[3]-массив переменных
  10. double xk, yk, zk, xn, yn, zn,
  11. max; //изменение значения переменных при k=0,1,2..
  12. int k = 0; //кол-во итераций
  13. //Матрица Якоби
  14. {
  15. a[0][0] = (-2 * x - 1);
  16. a[0][1] = (2 * z);
  17. a[0][2] = (2 * y);
  18. a[1][0] = (-3 * z);
  19. a[1][1] = (2 * y - 1);
  20. a[1][2] = (-3 * x);
  21. a[2][0] = (-2 * y);
  22. a[2][1] = (-2 * x);
  23. a[2][2] = (-2 * z - 1);
  24. //Определитель
  25. det = a[0][0] * a[1][1] * a[2][2] + a[0][1] * a[1][2] * a[2][0] +
  26. a[0][2] * a[1][0] * a[2][1] -
  27. a[0][2] * a[1][1] * a[2][0] - a[0][0] * a[1][2] * a[2][1] - a[0][1] *
  28. a[1][0] * a[2][2];
  29. invdet = 1 / det;
  30.  
  31. //Обратная матрица
  32. for (i = 0; i < n; i++)
  33. {
  34. for (j = 0; j < n; j++)
  35. {
  36. a1[0][0] = a[1][1] * a[2][2] - a[1][2] * a[2][1] * invdet;
  37. a1[0][1] = -a[1][0] * a[2][2] + a[2][0] * a[1][2] * invdet;
  38. a1[0][2] = a[1][0] * a[2][1] - a[1][1] * a[2][0] * invdet;
  39. a1[1][0] = -a[0][1] * a[2][2] + a[0][2] * a[2][1] * invdet;
  40. a1[1][1] = a[0][0] * a[2][2] - a[0][2] * a[2][0] * invdet;
  41. a1[1][2] = -a[0][0] * a[2][1] + a[0][1] * a[2][0] * invdet;
  42. a1[2][0] = a[0][1] * a[1][2] - a[0][1] * a[1][1] * invdet;
  43. a1[2][1] = -a[0][0] * a[1][2] + a[0][2] * a[2][0] * invdet;
  44. a1[2][2] = a[0][0] * a[1][1] - a[0][1] * a[1][0] * invdet;
  45. }
  46. }
  47.  
  48. //Массив функций
  49. for (j = 0; j < n; j++)
  50. {
  51. f[0] = f1(x, y, z);
  52. f[1] = f2(x, y, z);
  53. f[2] = f3(x, y, z);
  54. }
  55.  
  56. //Массив переменных
  57. for (j = 0; j < n; j++)
  58. {
  59. K[0] = x;
  60. K[1] = y;
  61. K[2] = z;
  62. }
  63.  
  64. do {
  65. for (i = 0; i < n; i++)
  66. {
  67. for (j = 0; j < n; j++)
  68. {
  69. b[0] = a[0][0] * f[0] + a[0][1] * f[1] + a[0][2] * f[2];
  70. b[1] = a[1][0] * f[0] + a[1][1] * f[1] + a[1][2] * f[2];
  71. b[2] = a[2][0] * f[0] + a[2][1] * f[1] + a[2][2] * f[2];
  72. }
  73. }
  74.  
  75. xk = K[0] - b[0];
  76. yk = K[1] - b[1];
  77. zk = K[2] - b[2];
  78. xn = xk - x;
  79. yn = yk - y;
  80. zn = zk - z;
  81. {
  82. if (abs(xn) > abs(yn))
  83. {
  84. if (abs(xn) > abs(zn))
  85. {
  86. max = xn;
  87. }
  88. else
  89. {
  90. max = zn;
  91. }
  92. }
  93. else
  94. {
  95. if (abs(yn) > abs(zn))
  96. {
  97. max = yn;
  98. }
  99. else
  100. {
  101. max = zn;
  102. }
  103. }
  104. }
  105. x = xk;
  106. y = yk;
  107. z = zk;
  108. } while (abs(max) >= esp);
  109.  
  110. k++;
  111. Edit5->Text = FloatToStr(xk);
  112. Edit6->Text = FloatToStr(yk);
  113. Edit7->Text = FloatToStr(zk);
  114. Edit8->Text = FloatToStr(k);
  115. }
  116. }
  117.  
  118. //Обратная матрица
  119. for (i=0; i<n; i++){
  120. for (j=0; j<n; j++){
  121. a1[0][0]= a[1][1]*a[2][2]-a[1][2]*a[2][1]*invdet;
  122. a1[0][1]=-a[1][0]*a[2][2]+a[2][0]*a[1][2]*invdet;
  123. a1[0][2]= a[1][0]*a[2][1]-a[1][1]*a[2][0]*invdet;
  124. a1[1][0]=-a[0][1]*a[2][2]+a[0][2]*a[2][1]*invdet;
  125. a1[1][1]= a[0][0]*a[2][2]-a[0][2]*a[2][0]*invdet;
  126. a1[1][2]=-a[0][0]*a[2][1]+a[0][1]*a[2][0]*invdet;
  127. a1[2][0]= a[0][1]*a[1][2]-a[0][1]*a[1][1]*invdet;
  128. a1[2][1]=-a[0][0]*a[1][2]+a[0][2]*a[2][0]*invdet;
  129. a1[2][2]= a[0][0]*a[1][1]-a[0][1]*a[1][0]*invdet;
  130. }
  131. }
Add Comment
Please, Sign In to add comment