Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma endregion
- double f(double m, double p, double x, char k1) // Ліві частини рівнянь
- {
- switch (k1)
- {
- case 0: return m*x*x + p;
- break;
- case 1: return m * x + p;
- break;
- }
- }
- double fp(double m, double p, double x, char k1,double d) // Перша похідна
- {
- return (f(m,p,x + d,k1) - f(m,p,x,k1)) / d;
- }
- double f2p(double m, double p, double x, double d, char k1) // Друга похідна
- {
- return (f(m,p,x + d, k1) + f(m,p,x - d, k1) - 2 * f(m,p,x, k1)) / (d * d);
- }
- double MDP(double m, double p, double a, double b, double Eps, char k1, int &lich)
- {
- double c, Fc;
- if (Math::Abs(m) < Eps && Math::Abs(p) < Eps) {
- MessageBox::Show("РІВНЯННЯ ПОГАНО ОБУМОВЛЕНЕ");
- return 0;
- }
- while (b - a > Eps)
- {
- c = 0.5 * (b - a) + a;
- lich = lich + 1; // Лічильник кількості поділів інтервалу [a, b]
- Fc = f(m,p,c, k1);
- if (Math::Abs(Fc) < Eps) // Перевірка, чи точка с не є поблизу кореня x*
- return c; // Завершення роботи функції MDP
- if (f(m, p, a, k1) * Fc > 0) { a = c; }
- else { b = c; }
- }
- return c; // Завершення роботи функції MDP
- }
- double MN(double m, double p, double a, double b, double Eps, char k1, int &lich,int &Kmax)
- {
- double x0, xn;
- int i = lich;
- double dx = Eps / 1000;
- if (Math::Abs(m) < Eps && Math::Abs(p) < Eps) {
- MessageBox::Show("РІВНЯННЯ ПОГАНО ОБУМОВЛЕНЕ");
- return 0;
- }
- if (f(m, p, a, k1) * f2p(m, p, a, dx, k1) > 0)
- {
- x0 = a;
- }
- else {
- x0 = b;
- }
- xn = x0 - f(m, p, x0, k1) / fp(m, p, x0, k1, dx);
- while (Math::Abs(x0 - xn)> Eps && i<=Kmax)
- {
- x0 = xn;
- xn = x0 - f(m, p, x0, k1) / fp(m, p, x0, k1, dx);
- i=i+1;
- }
- lich = i;
- return xn;
- }
- private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
- switch (comboBox1->SelectedIndex)
- {
- case 0:
- {
- label7->Visible = false; // Робимо невидимим вікно для введення Kmax
- textBox4->Visible = false;
- textBox1->Clear();
- textBox2->Clear();
- } break;
- case 1:
- {
- label7->Visible = true; // Робимо видимим вікно для введення Kmax
- textBox4->Visible = true;
- textBox1->Clear();
- textBox2->Clear();
- } break;
- }
- }
- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
- int L, k = -1, Kmax, n = -1; double D, Eps, a, b,m,p;
- L = 0;
- switch (comboBox1->SelectedIndex) // Вибір методу :
- {
- case 0: n = 0; break; // метод ділення навпіл
- case 1: // метод Ньютона
- {
- n = 1;
- D = Eps / 100.0;
- label7->Visible = true; // Робимо видимим вікно для введення Kmax
- textBox4->Visible = true;
- textBox4->Enabled = true;
- } break;
- }
- if (n == -1)
- {
- MessageBox::Show("Оберіть метод !"); comboBox1->Focus();
- return;
- }
- textBox1->Enabled = true; textBox2->Enabled = true;
- switch (comboBox2->SelectedIndex) // Вибір нелінійного рівняння
- {
- case 0: k = 0; break;
- case 1: k = 1; break;
- }
- if (k == -1)
- {
- MessageBox::Show("Оберіть рівняння !"); comboBox2->Focus();
- return;
- }
- // Перевіряємо правильність введення вхідних даних
- if (textBox1->Text == "")
- {
- MessageBox::Show("Введіть число в textBox1"); textBox1->Focus();
- return;
- }
- textBox7->Enabled = true;
- textBox8->Enabled = true;
- m = Convert::ToDouble(textBox7->Text);
- p = Convert::ToDouble(textBox8->Text);
- a = Convert::ToDouble(textBox1->Text);
- textBox2->Enabled = true;
- if (textBox2->Text == "")
- {
- MessageBox::Show("Введіть число в textBox2"); textBox2->Focus();
- return;
- }
- b = Convert::ToDouble(textBox2->Text); if (a > b)
- {
- D = a;
- a = b;
- b = D; // Міняємо місцями a і b
- textBox1->Text = Convert::ToString(a); textBox2->Text = Convert::ToString(b);
- }
- if (textBox3->Text == "")
- {
- MessageBox::Show("Введіть число в textBox3"); textBox1->Focus();
- return;
- }
- Eps = Convert::ToDouble(textBox3->Text);
- if ((Eps > 1e-1) || (Eps <= 0)) // Похибка Eps не повинна бути більшою за 0.1 або меншою за 0
- {
- Eps = 1e-4; // Задаємо примусово Eps = 0.0001
- textBox3->Text = Convert::ToString(Eps);
- }
- if (Math::Abs(m) < Eps && Math::Abs(p) < Eps) {
- MessageBox::Show("РІВНЯННЯ ПОГАНО ОБУМОВЛЕНЕ"); textBox7->Focus(); textBox8->Focus();
- return;
- }
- if (Math::Abs(m) < Eps ) {
- MessageBox::Show("Рівняння не має розв'язків"); textBox7->Focus(); textBox8->Focus();
- return;
- }
- if (n == 0)
- if ((f(m,p,a, k))* (f(m,p,b, k)) > 0) // чи є корінь на інтервалі [a,b]
- {
- MessageBox::Show("Введіть правильний інтервал [a, b]!");
- textBox1->Text = "";
- textBox2->Text = "";
- textBox1->Focus(); return;
- }
- // Перевіряємо, чи межі інтервалу [a,b] не є поблизу кореня
- if (Math::Abs(f(m,p,a, k)) < Eps)
- {
- textBox5->Text = Convert::ToString(a);
- textBox6->Text = Convert::ToString(L);
- return;
- }
- if (Math::Abs(f(m,p,b, k)) < Eps)
- {
- textBox5->Text = Convert::ToString(b);
- textBox6->Text = Convert::ToString(L);
- return;
- }
- switch (n)
- {
- case 0: // Виклик методу ділення навпіл MDP
- {
- textBox5->Text = Convert::ToString(MDP(m,p,a, b, Eps, k, L));
- textBox6->Text = Convert::ToString(L);
- label10->Text = "К-ть поділів =";
- } break;
- case 1: // Виклик методу Ньютона
- {
- if (textBox4->Text == "")
- {
- MessageBox::Show("Введіть число в textBox4");
- textBox4->Focus();
- return;
- }
- Kmax = Convert::ToInt32(textBox4->Text);
- textBox5->Text = Convert::ToString(MN(m,p,a, b, Eps, k, L,Kmax));
- textBox6->Text = Convert::ToString(L);
- label10->Text = "К-ть ітерац.=";
- } break;
- }
- }
- private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
- textBox1->Clear(); textBox2->Clear();
- textBox3->Clear(); textBox4->Clear();
- textBox5->Clear(); textBox6->Clear();
- textBox7->Clear(); textBox8->Clear();
- switch (comboBox1->SelectedIndex)
- {
- case 0:
- {
- label7->Visible = false; // Робимо невидимим вікно для введення Kmax
- textBox4->Visible = false;
- } break;
- case 1:
- {
- label7->Visible = true; // Робимо видимим вікно для введення Kmax
- textBox4->Visible = true;
- } break;
- }
- }
- private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
- Close();
- }
- };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement