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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Newton_s_method {
class Program {
// значение функции в точке x
public static double getFunction(double x) {
double retValue = (Math.Tan(x) - Math.Pow(Math.Tan(x), 3) / 3 + Math.Pow(Math.Tan(x), 5) / 5 - 1 / 3);
return retValue;
}
// значение первой производной функции в точке x
public static double getFirstDerivative(double x) {
double retValue = (Math.Pow(Math.Tan(x), 4) * (Math.Pow(Math.Tan(x), 2) + 1) - Math.Pow(Math.Tan(x), 2) * (Math.Pow(Math.Tan(x), 2) + 1) + Math.Pow(Math.Tan(x), 2) + 1);
return retValue;
}
// значение второй производной функции в точке x
public static double getSecondDerivative(double x) {
double retValue = -(12.96 * Math.Sin(3.6 * x)) / Math.Pow(Math.Sin(3.6 * x) + 3, 2.0) -
(25.92 * Math.Pow(Math.Cos(3.6 * x), 2.0)) / Math.Pow(Math.Sin(3.6 * x) + 3, 3.0);
return retValue;
}
static void Main(string[] args) {
double leftRange = 0.0, // левая граница интервала изоляции корня
rightRange = 0.8, // правая граница интервала изоляции корня
eps = 0.0001; // заданная точность
double curApproximation = 0.0, // текущее приближение
nextApproximation = 0.0, // последующее приближение
difference = 0.0; // разность
int countIter = 0; // количество итераций
// зададим начальное приближение
while(true) {
curApproximation = double.Parse(Console.ReadLine());
if (curApproximation < leftRange || curApproximation > rightRange)
Console.WriteLine("Заданное Вами приближение находится вне границ отрезка [a, b]. Пожалуйста, повторите ввод:");
else if (getFunction(curApproximation) * getSecondDerivative(curApproximation) <= 0)
Console.WriteLine("Заданное Вами приближение не удовлетворяет критерию сходимости метода Ньютона к корню уравнения. Пожалуйста, повторите ввод:");
else
break;
}
// метод Ньютона
do {
nextApproximation = curApproximation - getFunction(curApproximation) / getFirstDerivative(curApproximation); // вычисляем новое приближение
difference = Math.Abs(nextApproximation - curApproximation); // вычисляем модуль разности
curApproximation = nextApproximation; // обновляем приближение
countIter++; // увеличиваем кол-во итераций
} while (difference > eps); // проверка сходимости
// вывод результата
Console.WriteLine("Найденный корень: x = {0:f4}", nextApproximation);
Console.WriteLine("Проверка: F(x) = {0}", getFunction(nextApproximation));
}
}
}