Методы решения нелинейных уравнений - C#
Формулировка задачи:
Доброго времени суток!
Знаю что тема уже довольно избита, но вопросы по ней всё таки имеются.
Если быть точнее, то вопрос касательно двух простых методов - Ньютона и простой итерации.
Делаю по аналогам, которые находил в интернете, но возникает 2 проблемы, которые не удается решить:
1. Метод Ньютона уходит в бесконечный цикл;
2. Метод простой итерации выдает бесконечность в большинстве случаев или выдает какую то хрень.
Собственно вот код:
За пару лет до этого, приходилось делать то же самое, только на С++ и алгоритм немного отличался. Я его переписал под шарп и результат всё тот же. Вот код:
И вот метод простой итерации тоже в двух вариантах:
Ниже пример расчета методов.
// Вычисляемое уравнение
static double equat(double x)
{
return Math.Pow(x, 2) - Math.Cos(Math.PI / x);
}
// Его производная
static double equatDiverative(double x)
{
return 2 * x + (1 / x);
}
public static void MethodNewton()
{
int n = 0;
double x0, eps = 0.001, x = 1.2;
Console.WriteLine("x0 = {0}\neps = {1}", x, eps);
do
{
x0 = x - equat(x) / equatDiverative(x);
x = x0;
n++;
} while (Math.Abs(equat(x)) >= eps);
Console.WriteLine("Result: {0}\nIterat: {1}", x, n);
} do
{
x = x - equat(x) / equatDiverative(x);
n++;
} while (Math.Abs(equat(x)) >= eps);public static void MethodIterat()
{
int n = 0;
double a = 1.2, b = 0.6, eps = 0.0001, x = 0;
Console.WriteLine("a = {0}\neps = {1}", a, eps);
double xPrev = a;
var iter = 0;
do
{
x = equat(xPrev);
if (Math.Abs(x - xPrev) <= eps || iter == 1000)
{
break;
}
xPrev = x;
iter++;
}
while (true);
Console.WriteLine("Result: {0}\nIterat: {1}", xPrev, n);
} do
{
x = equat(x);
c = x;
n++;
} while (Math.Abs(x - с) >= eps || n == 1000);Решение задачи: «Методы решения нелинейных уравнений»
textual
Листинг программы
do
{
x = equat(x);
c = x;
n++;
} while (Math.Abs(x - с) >= eps || n == 1000);