Как записать вычисление функции через ряда Тейлора на C#?

Необходимо вычислить функцию


double sum = o
for(double n = 0; Math.Abs(sum) < e; n++
{
    double slag = 1/(2 * n + 1) * Math.Pow(x, (2 * n + 1));
    sum += slag;
}
res = sum;

Формула расчета верная, но проблема точно где-то в условиях цикла for…


Ответы (2 шт):

Автор решения: MBo

Попробуем сообразить, что вы имели в виду. Использован ряд Тейлора для гиперболического арктангенса.

При этом условие окончание непонятное - сумма сравнивается с каким-то е. Обычно проверяют, что очередное слагаемое стало меньше некоего малого значения.

(Возможно, по условию задачи (которого мы не видели) вам требуется найти, когда, при каком n, сумма ряда станет больше e, но крайне сомнительно, особенно для данного быстросходящегося ряда)

Кроме того, при вычислении слагаемого происходит деление целых чисел, поэтому со второго оборота цикла слагаемое получается нулевым.

Использование Pow - не ошибка, но неразумно, очередную нечётную степень проще посчитать, домножив предыдущую на икс квадрат.

Получается вот что:

double x = 0.5;
double xx = x;
double x2 = x * x;
double sum = 0;
double slag = 1.0;
double eps = 1.0E-6;
int n = 0;
while (Math.Abs(slag) > eps)
{
    slag = xx / (2 * n + 1);
    xx *= x2;
    sum += slag;
    n++;
}
Console.WriteLine(sum);

Выводит, как и положено, 0.549306014505833

→ Ссылка
Автор решения: CrazyElf

Можно и с циклом for ваш код оставить, но переделать придётся почти всё. Разберём по строкам:

double sum = o
  • у вас написана буква o вместо цифры 0.
  • в конце строки должна быть точка с запятой.
for(double n = 0; Math.Abs(sum) < e; n++
  • не сумма sum должна проверяться, а слагаемое slug
  • у for пишется условие продолжения цикла, а не выхода из цикла, поэтому не < e, а > e
  • переменная e у вас заранее не определена
  • в конце строки нет закрывающей скобки
    double slag = 1/(2 * n + 1) * Math.Pow(x, (2 * n + 1));
  • переменную slag нужно описать заранее и сделать такой, чтобы выход из цикла не произошёл сразу же
  • переменная x у вас не определена
res = sum;
  • переменная res у вас не объявлена, да и зачем нужна лишняя переменная, когда результат лежит в sum?

Итого полный переделанный код:

double e = 1e-6;
double x = 0.5;
double sum = 0;
double slag = 1 + e;
for(double n = 0; Math.Abs(slag) > e; n++)
{
    slag = 1/(2 * n + 1) * Math.Pow(x, (2 * n + 1));
    sum += slag;
}
Console.WriteLine (sum);
// 0.549306014505833

Код в принципе рабочий, но мне лично не нравится, что нужно хитрить со slug до цикла, лучше сделать условие и break внутри цикла. Или перейти на цикл while, как в другом ответе.

→ Ссылка