Advertisement
daniv1

Untitled

Dec 8th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.88 KB | None | 0 0
  1. #pragma endregion
  2. char k1;
  3.  
  4. double f(double x, char k1)
  5. {
  6. switch (k1)
  7. {
  8. case 0: return x * x - 4; break;
  9. case 1: return 3 * x - 4 * Math::Log(x) - 5; break;
  10. }
  11. }
  12.  
  13.  
  14.  
  15.  
  16. double fp(double x, double d, char k1)
  17. {
  18. return (f(x + d, k1) - f(x, k1)) / d;
  19. }
  20.  
  21. double f2p(double x, double d, char k1)
  22. {
  23. return (f(x + d, k1) + f(x - d, k1) - 2 * f(x, k1)) / (d * d);
  24. }
  25.  
  26.  
  27. double MDP(double a, double b, double Eps, char k1, int &L)
  28. {
  29. double c, Fc; while (b - a > Eps)
  30. {
  31. c = 0.5 * (b - a) + a;
  32. L = L + 1; // Лічильник кількості поділів інтервалу [a, b]
  33. Fc = f(c, k1);
  34. if (Math::Abs(Fc) < Eps) // Перевірка, чи точка с не є поблизу кореня x*
  35. return c; // Завершення роботи функції MDP
  36. if (f(a, k1) * Fc > 0) a = c;
  37. else b = c;
  38. }
  39. return c; // Завершення роботи функції MDP
  40. }
  41.  
  42.  
  43. double MN(double a, double b, double Eps, char k1, int Kmax, int &L)
  44. {
  45. double x, Dx, D;
  46. int i;
  47. Dx = 0.0;
  48. D = Eps / 100.0;
  49. x = b;
  50. if (f(x, k1) * f2p(x, D, k1) < 0) x = a;
  51.  
  52. if (f(x, k1) * f2p(x, D, k1) < 0)
  53. MessageBox::Show("Для цього рівняння збіжність ітерацій не гарантована");
  54. for (i = 1; i <= Kmax; i++)
  55. {
  56. Dx = f(x, k1) / fp(x, D, k1);
  57. x = x - Dx;
  58.  
  59. if (Math::Abs(Dx) < Eps)
  60. {
  61. L = i;
  62. return x; // Завершення роботи функції MN
  63. }
  64. }
  65. MessageBox::Show("За задану кількість ітерацій кореня не знайдено");
  66. return -1000.0; // -1000.0 Це наша ознака цієї нестандартної ситуації
  67. }
  68.  
  69. private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
  70. switch (comboBox1->SelectedIndex)
  71. {
  72.  
  73. case 0:
  74. {
  75. label7->Visible = false; // Робимо невидимим вікно для введення Kmax
  76. textBox4->Visible = false;
  77.  
  78. } break;
  79. case 1:
  80. {
  81. label7->Visible = true; // Робимо видимим вікно для введення Kmax
  82. textBox4->Visible = true;
  83.  
  84. }
  85. break;
  86. }
  87.  
  88. }
  89. private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
  90. int L, k = -1, Kmax, m = -1;
  91. double D, Eps, a, b;
  92. char k1;
  93. L = 0;
  94.  
  95. switch (comboBox1->SelectedIndex) // Вибір методу :
  96. {
  97. case 0: m = 0; break; // метод ділення навпіл
  98. case 1: // метод Ньютона
  99. {
  100. m = 1;
  101. D = Eps / 100.0;
  102. label7->Visible = true; // Робимо видимим вікно для введення Kmax
  103. textBox4->Visible = true;
  104. textBox4->Enabled = true;
  105. } break;
  106. }
  107. if (m == -1)
  108. {
  109. MessageBox::Show("Оберіть метод !");
  110. comboBox1->Focus();
  111. return;
  112. }
  113. textBox1->Enabled = true;
  114. textBox2->Enabled = true;
  115. switch (comboBox2->SelectedIndex) // Вибір нелінійного рівняння
  116. {
  117. case 0: k = 0; break;
  118. case 1: k = 1; break;
  119. }
  120. if (k == -1)
  121. {
  122. MessageBox::Show("Оберіть рівняння !");
  123. comboBox2->Focus();
  124. return;
  125. }
  126. // Перевіряємо правильність введення вхідних даних
  127. if (comboBox1->SelectedIndex == 0)
  128. {
  129. if (textBox1->Text == "")
  130. {
  131. MessageBox::Show("Введіть число в textBox1"); textBox1->Focus();
  132. return;
  133. }
  134. a = Convert::ToDouble(textBox1->Text);
  135. textBox2->Enabled = true;
  136. if (textBox2->Text == "")
  137. {
  138. b = Convert::ToDouble(textBox2->Text);
  139. }
  140.  
  141. b = Convert::ToDouble(textBox2->Text);
  142. }
  143.  
  144.  
  145.  
  146. else if (comboBox1->SelectedIndex == 1)
  147. {
  148. textBox2->Enabled = true;
  149. if (textBox2->Text == "" && textBox1->Text == "" )
  150. {
  151. MessageBox::Show("Введіть число в textBox1 та textBox2!!!");
  152. return;
  153. }
  154. if (textBox2->Text == "")
  155. {
  156. a = Convert::ToDouble(textBox1->Text);
  157. b = a + 1;
  158. }
  159. else if (textBox1->Text == "")
  160. {
  161. b = Convert::ToDouble(textBox2->Text);
  162. a = b + 1;
  163. }
  164. else if (textBox1->Text && textBox2->Text)
  165. {
  166. b = Convert::ToDouble(textBox2->Text);
  167. a = Convert::ToDouble(textBox1->Text);
  168. }
  169. }
  170.  
  171. if (a > b)
  172.  
  173. {
  174. D = a;
  175. a = b;
  176. b = D; // Міняємо місцями a і b
  177.  
  178.  
  179. }
  180.  
  181. if (textBox3->Text == "")
  182. {
  183. MessageBox::Show("Введіть число в textBox3"); textBox1->Focus();
  184.  
  185. return;
  186. }
  187. Eps = Convert::ToDouble(textBox3->Text);
  188. if ((Eps > 1e-1) || (Eps <= 0)) // Похибка Eps не повинна бути більшою за 0.1 або меншою за 0
  189. {
  190. Eps = 1e-4; // Задаємо примусово Eps = 0.0001
  191. textBox3->Text = Convert::ToString(Eps);
  192. }
  193. if (m == 0)
  194. if ((f(a, k))* (f(b, k)) > 0) // чи є корінь на інтервалі [a,b]
  195. {
  196. MessageBox::Show("Введіть правильний інтервал [a, b]!"); textBox1->Text = "";
  197. textBox2->Text = "";
  198. textBox1->Focus();
  199. return;
  200. }
  201.  
  202. // Перевіряємо, чи межі інтервалу [a,b] не є поблизу кореня
  203. if (Math::Abs(f(a, k)) < Eps)
  204. {
  205. textBox5->Text = Convert::ToString(a);
  206. textBox6->Text = Convert::ToString(L);
  207. return;
  208. }
  209. if (Math::Abs(f(b, k)) < Eps)
  210. {
  211. textBox5->Text = Convert::ToString(b);
  212. textBox6->Text = Convert::ToString(L);
  213. return;
  214. }
  215. double result = 0;
  216.  
  217. switch (m)
  218. {
  219. case 0: // Виклик методу ділення навпіл MDP
  220. {
  221.  
  222. result = MDP(a, b, Eps, k, L);
  223. textBox5->Text = Convert::ToString(result);
  224. textBox6->Text = Convert::ToString(L);
  225. label10->Text = "К-ть поділів =";
  226.  
  227. } break;
  228. case 1: // Виклик методу Ньютона
  229. {
  230. if (textBox4->Text == "")
  231. {
  232. MessageBox::Show("Введіть число в textBox4");
  233. textBox4->Focus();
  234. return;
  235. }
  236. if(k1 = 1)
  237. result = MN(a, b, Eps, k, Kmax, L);
  238. Kmax = Convert::ToInt32(textBox4->Text);
  239. textBox5->Text = Convert::ToString(result);
  240. textBox6->Text = Convert::ToString(L);
  241.  
  242. label10->Text = "К-ть ітерац.=";
  243. } break;
  244. }
  245. textBox7->Text = Convert::ToString(f(result,k));
  246.  
  247. }
  248. private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
  249. textBox1->Clear();
  250. textBox2->Clear();
  251. textBox7->Clear();
  252. textBox3->Clear();
  253. textBox4->Clear();
  254. textBox5->Clear();
  255. textBox6->Clear();
  256. switch (comboBox1->SelectedIndex)
  257. {
  258. case 0:
  259. {
  260. label7->Visible = false; // Робимо невидимим вікно для введення Kmax
  261. textBox4->Visible = false;
  262. } break; case 1:
  263. {
  264.  
  265. label7->Visible = true; // Робимо видимим вікно для введення Kmax
  266. textBox4->Visible = true;
  267. } break;
  268. }
  269.  
  270. }
  271.  
  272.  
  273. };
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement