Как записать вычисление функции через ряда Тейлора на 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 шт):
Попробуем сообразить, что вы имели в виду. Использован ряд Тейлора для гиперболического арктангенса.
При этом условие окончание непонятное - сумма сравнивается с каким-то е
. Обычно проверяют, что очередное слагаемое стало меньше некоего малого значения.
(Возможно, по условию задачи (которого мы не видели) вам требуется найти, когда, при каком 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
Можно и с циклом 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
, как в другом ответе.