1

Тема: Скласти алгоритм обчислення значення функції

Завдання:
Скласти алгоритм і програму обчислення значення функції, представленої у вигляді суми елементів нескінченного збіжного ряду з точністю eps1 = 0.01 і eps2 = 0.0001. Вивести значення суми елементів ряду s, кількість ітерацій (n), за яких було досягнуто заданої точності (еps).
S=arth(x)=x+x^3/3+x^5/5+x^7/7+⋯       |x|≤1
https://i.ibb.co/wwzxvXD/image.png
Ось, що мені вдалося написати:

#include <stdio.h>
#include <math.h>

int main() {
    double eps, x, sum, intr, secondSum;
    int iter;
    scanf("%lf", &eps);
    scanf("%lf", &x);
    if (x != 1) {
        secondSum = 0.5 * log((1 + x) / (1 - x));
    } else {
        printf("x can not be equal 1");
        return 0;
    }
    intr = x;
    while (intr > eps) {
        intr = ((pow(x, iter)) / iter);
        sum += intr;
        iter += 2;
    }
    printf("Sum of sequence = %lf\n", sum);
    printf("arth(x) = %lf", secondSum);
    return 0;
}

Проблема в тому, що "Sum of sequence" не виводиться в консолі, воно постійно виводить inf. Також точність (eps) чомусь взагалі не впливає на результат, хоча по ідеї точність результату повинна змінюватися при різних значеннях eps. Ну і чомусь компілятор свариться на те, що використовується неініціалізована локальна змінна "iter" та "sum", тому я їм задаю початкове значення 0 (double sum=0; int iter=0).
Буду дуже вдячний за допомогу!

2

Re: Скласти алгоритм обчислення значення функції

K1T написав:

Ну і чомусь компілятор свариться на те, що використовується неініціалізована локальна змінна "iter" та "sum", тому я їм задаю початкове значення 0 (double sum=0; int iter=0).

Де? У коді я бачу

    double eps, x, sum, intr, secondSum;
    int iter;

Неініціалізовані.

Подякували: leofun011

3

Re: Скласти алгоритм обчислення значення функції

koala написав:

Де?

В цьому коді я це не продемонстрував, тому що гадав що повинно і так повинно працювати (без цієї ініціалізації), і що це з моїм компілятором щось не те, напевно я помилявся.
Ось повний код:

#include <stdio.h>
#include <math.h>

int main() {
    double eps, x, sum=0, intr, secondSum;
    int iter=0;
    scanf_s("%lf", &eps);
    scanf_s("%lf", &x);
    if (x != 1) {
        secondSum = 0.5 * log((1 + x) / (1 - x));
    }
    else {
        printf_s("x can not be equal 1");
        return 0;
    }
    intr = x;
    while (intr > eps) {
        intr = ((pow(x, iter)) / iter);
        sum += intr;
        iter += 2;
    }
    printf_s("Sum of sequence = %lf\n", sum);
    printf_s("arth(x) = %lf", secondSum);
    return 0;
}

Але проблеми так і залишаються:

K1T написав:

Проблема в тому, що "Sum of sequence" не виводиться в консолі, воно постійно виводить inf. Також точність (eps) чомусь взагалі не впливає на результат, хоча по ідеї точність результату повинна змінюватися при різних значеннях eps.

І я не розумію в чому саме я помилився і як це виправити.

4 Востаннє редагувалося koala (21.11.2022 16:20:50)

Re: Скласти алгоритм обчислення значення функції

Ви не той ряд сумуєте. Має починатися з iter=1, а у вас iter=0.
Загальні поради:
1. Проголошуйте змінні якомога ближче до місця використання. Колись активно користувалися goto і проголошення змінних доводилося робити на початку коду, щоб не перестрибнути його; але ті часи давно минули. Значно простіше пропустити помилку, якщо значення встановлюється в одному місці, а обчислення - в іншому.
2. Якщо десь перериваєте обчислення (return, наприклад) - не треба писати другу гілку.
3. Не забувайте, де у вас double, а де int, і використовуйте відповідні значення.

    double eps, x;
    scanf_s("%lf", &eps);
    scanf_s("%lf", &x);
    if (x >= 1.0) {
        printf_s("x can not be greater or equal 1");
        return 0;
    } 
    double intr = x, sum = 0.0;
    int iter=1;
    while (intr > eps) {
        intr = ((pow(x, iter)) / iter);
        sum += intr;
        iter += 2;
    }
    printf_s("Sum of sequence = %lf\n", sum);
    double secondSum = 0.5 * log((1.0 + x) / (1.0 - x));
    printf_s("arth(x) = %lf", secondSum);
    return 0;

Якось так.

Подякували: leofun01, K1T2

5

Re: Скласти алгоритм обчислення значення функції

Ну і для галочки - умова завершення |a(n)|<eps (до речі, модуль теж треба додати) працює лише для знакозмінних рядів, але якщо викладач дозволяє, то будь ласка.

Подякували: K1T1

6

Re: Скласти алгоритм обчислення значення функції

Ще одне таке питання, як зробити так щоб від'ємні числа теж обраховувалися (наприклад при x = -0.5)?

#include <stdio.h>
#include <math.h>
#include <windows.h>
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    double eps, x;
    printf_s("Введіть точність (eps) суми: ");
    scanf_s("%lf", &eps);
    printf_s("Введіть значення х, у межах (-1;1): ");
    scanf_s("%lf", &x);
    if (x >= 1.0 || x <= -1.0) {
        printf_s("х не може дорівнювати %lf\n", x);
        return 0;
    }
    if (eps >= 1.0 || eps < 0) {
        printf_s("Точність (eps) не може дорівнювати %lf\n", eps);
        return 0;
    }
    double intr = fabs(x), sum = 0.0;
    int iter = 1, counter = 0;
    while (intr > eps) {
        intr = ((pow(x, iter)) / iter);
        sum += intr;
        iter += 2;
        counter++;
    }
    printf_s("\nСума елементів ряду із заданою точністю: S = %lf\n", sum);
    printf_s("Кількість ітерацій, за яких було досягнуто заданої точності: n = %d\n", counter);
    printf_s("arth(x) = %lf\n", atanhl(x));
    return 0;
}

І ще чому при точності (eps) "0", результат обраховується, ще й максимально точно. "0" дає максимальну точність, чи як?

7

Re: Скласти алгоритм обчислення значення функції

K1T написав:
double intr = fabs(x), sum = 0.0;

Ой помилився, тут просто

double intr = x, sum = 0.0;

8

Re: Скласти алгоритм обчислення значення функції

Я ж написав - в умову завершення циклу треба додати модуль.

K1T написав:

"0" дає максимальну точність, чи як?

Так, у певному сенсі максимальну. Закінчуються розряди в double. Але розраховувати на таке не слід, бо будь-яке обчислення з рухомою комою має неточність, і отримати точне значення найчастіше неможливо. Похибка при обчисленні значення функції вашою програмою, швидше за все, більша за похибку double.

Подякували: K1T1

9

Re: Скласти алгоритм обчислення значення функції

Ой точно, вибачте, неуважно прочитав Ваші повідомлення.
Але у Вас знак менше, хоча повинно бути більше, ось так:

while (fabs(intr) > eps)

Зі знаком менше воно не працює.

10

Re: Скласти алгоритм обчислення значення функції

Так, бо я писав про умову завершення, а не продовження. Правда, не врахував варіант =.

Подякували: K1T1