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