Advertisement
daniv1

Untitled

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