Как записать вычисление функции через ряда Тейлора на 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, как в другом ответе.