Я пытаюсь написать программу, которая читает от пользователя количество терминов, которые будут использоваться при вычислении натурального логарифма 2. Пример: Log (2) с 5 терминами составляет 1/1 — 1/2 + 1/3 — 1/4 + 1/5. Знаменатель увеличивается на 1 с каждым последующим слагаемым, а знаки сложения и вычитания чередуются между каждым слагаемым. Я просто не могу найти правильную настройку петли, чтобы заставить это работать правильно. Любая помощь будет оценена.
Используйте коэффициент умножения, который переключается с +1 на -1, а затем снова на +1 во время итерации, а затем умножьте текущее значение 1 / n на это.
double ln2(int terms) {
double sign = 1.0
double log = 0.0;
for (double n = 1; n <= terms; n += 1.0) {
// calculate your 1/n term here
log += sign / n; // == sign * 1.0 / n
// and reverse polarity for the next iteration
sign = -sign;
}
return log;
}
NB: эта серия сходится очень медленно!
Вы берете сумму (-1) ^ n * -1 / n. Если вы объедините два смежных термина, вы получите
(-1) ^ (2n-1) * -1 / (2n-1) + (-1) ^ (2n) * -1 / (2n) = 1 / (2n-1) — 1 / (2n) = 1 / (4 * n ^ 2 — 2 * n)
и так вы можете сделать
double ln2(int lim) {
double sum;
for (int n = 1; n <= lim; n++) {
sum += 1.0/n/(4*n - 2);
}
return sum;
}
Это все еще не быстро, но его поведение сходимости лучше.
Вы можете иметь отдельную переменную, n
что вы добавляете один к каждому разу, проверьте, если это даже с if (n%2 == 0)
, Если это правда, умножьте свой знаменатель на -1.