using System using System Collections Generic using System Linq using

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace task1
{
class Program
{
/*
* Метод возраващает значение функции
* x - параметр функции
* */
public static double F(double x)
{
double result = Math.Pow(x, 5) + 4 * Math.Pow(x, 4) - 57 * Math.Pow(x, 3) - 112 * Math.Pow(x, 2) + 664 *x - 478.5;
return result;
}
public static double dF(double x)
{
double result = 5*Math.Pow(x, 4) + 16 * Math.Pow(x, 3) - 171 * Math.Pow(x, 2) - 224 * x + 664;
return result;
}
/*
* Метод который ищет корень уравнения на заданном интервале по методу простой итерации
* x1 и x2 - аргументы, причем аргумент x2 следует из аргумента x1
* a и b - заданный отрезок, на котором лежит корень
* l - константа, для приведения исходной функции с сжимающей вида x = fi(x)
* */
public static void Mthd(double x1, double x2, double a, double b, double l, int k)
{
//eps - заданная точность вычислений
//d - параметр, который нужен для проверки условия сходимости
double eps = 0.0001, d = 0;
do
{
x2 = x1 + l * F(x1);
d = Math.Abs(x2 - x1);
x1 = x2;
}
while (d > eps);
Console.WriteLine("x{1} = {0:f5}", x1, k);
Console.WriteLine("Проверка верности найденного корня:\nF(x1) = {0:f2}", F(x1));
}
static void Main(string[] args)
{
double a = -10, b = 10;
double x1, x2 = 0;
bool value = false; // переменная типа bool, которая нужна для локализации всех корней нелинейного уравнения
double l = 0; // константа лямбда
int k = 0;
for (double i = a; i < b; i += 0.5)
{
if (value == false)
{
//определяем знак функции
//где она меняет свое значение
if (F(i) > 0)
{
value = true;
//новые отрезки, где лежит корень
double left = Math.Abs(i - 0.5);
double right = Math.Abs(i + 0.5);
Console.WriteLine("Границы нахождения корная [{0},{1}]\n", left, right);
x1 = (left + right) / 2; //середина отрезка
l = 1 / dF(x1);
k++;
Mthd(x1, x2, right, left, l, k); // вызываем метод простой итерации
Console.WriteLine("================================");
}
}
else
{
if (F(i) < 0)
{
value = false;
double left = Math.Abs(i - 0.5);
double right = Math.Abs(i + 0.5);
Console.WriteLine("Границы нахождения корная [{0},{1}]\n", left, right);
x1 = (left + right) / 2;
l = 1 / dF(x1);
k++;
Mthd(x1, x2, right, left, l, k);
Console.WriteLine("================================");
}
}
}
Console.ReadKey();
}
}
}