Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2022, 18:57   #1
AlexanderSan
Новичок
Джуниор
 
Регистрация: 15.12.2022
Сообщений: 1
По умолчанию В чем именно заключаются ошибки?

Препод говорит, что у меня по сути неправильный код. На вопрос, что именно он имеет в виду, отвечает, что у меня там не одна ошибка, и больше ничего. В компиляторах код работает адекватно. Так в чем именно косяк? Задача была вывести таблицу значений функции арксинус гиперболический Y=arsh(x) для аргумента, который изменяется в диапазоне от -0.9 до 0.9, и равномерно разбит на 11 интервалов. А также рассчитать для указанного диапазона аргумента необходимое количество членов ряда Тейлора по разложению функции, чтобы обеспечить отклонение не более 10-3 от табличного значения, которое следует принять за эталонное.
Код:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
long int mass1[10] = { 1,-1,9,-225,11025,-893025,108056025,-18261468200, 4108830350000, -1187451970000000 };
float factorial(float f) {
    if (f == 0 || f == 1) return 1;
    else { return f * factorial(f - 1); }
}
int main()
{
    setlocale(LC_ALL, "Ukrainian");
    int  Ninter = 11, tailorMember = 0, n = 1, K = 0;
    double Step, Min = -0.9, Max = 0.9, accuracy = 0.001, X, Ch = 0;
    Step = (Max - Min) / Ninter;
    cout << setw(3) << "i" << "  |" << setw(10) << "Аргумент" << "  |" << setw(16) << "Y" << "  |" << setw(14) << "Tailor" << "  |" << setw(5) << "TailorMember" << "  |" << endl;
    for (int i = 0; i <= Ninter; i++) {
        X = Min + Step * i;
        cout << setw(3) << i << "  |" << setw(10) << X << "  |" << setw(16) << asinh(X) << "  |";
        do {
            Ch += (mass1[K] * pow(X, n)) / factorial(n);
            K++;
            n += 2;
            tailorMember++;
        } while (abs(Ch - asinh(X)) > accuracy);
        cout << setw(14) << Ch << "  |" << setw(9) << tailorMember << "     |" << endl;
        tailorMember = 0;
        n = 1;
        K = 0;
        Ch = 0;
    }
    return 0;
}

Последний раз редактировалось BDA; 15.12.2022 в 19:24.
AlexanderSan вне форума Ответить с цитированием
Старый 16.12.2022, 00:53   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Ряд для обратного гиперболического синуса представлен ниже.
Для вычисления такого ряда считать факториалы вредно.
Можно увидеть, что an+1 = k*an
Можно найти k самому, но можно воспользоваться этим:
Код:
k = -(2*n + 1)**2 * x**2 / (2 * (n + 1) * (2*n + 3))
Алгоритм описал в Python. Нет, не со зла. Просто С не стоит.
Но тут всё с пояснениями.
Код:
from math import log      # подключил натуральный логарифм
xbeg = -0.9               # нач. значение
xend = 0.9                # конеч. значение
n = 11                    # число точек
dx = abs(xend - xbeg) / n # шаг
eps = 1.E-3               # точность вычисления
x = xbeg                  # первая точка
while x <= xend:          # будем перебирать все точки в диапазоне
    s = x                 # нач. значение ряда
    a = x                 # первый элемент ряда
    n = 0                 # число итераций
    while abs(a) > eps:   # достигнута точность?
        k = -(2*n + 1)**2 * x**2 / (2 * (n + 1) * (2*n + 3))  # Множитель
        a = a * k         # Следующий член ряда
        s += a            # Добавим в сумму
        n += 1            # увеличиваем число итераций n = n + 1
    fx = log(x + (x**2 + 1)**0.5) # Табличное значение обратного гиперболического синуса
    
    # Вывод результатов сёта: тек.знач. X   Сумма   Табл.знач. Число итераций
    print('x = {0:8.3f}  S(x) = {1:8.3f}  f(x) = {2:8.3f}  N = {3:4d}'.format(x, s, fx, n))
    x += dx               # Следующая точка
Мой результат:
Код:
x =   -0.900  S(x) =   -0.809  f(x) =   -0.809  N =   10
x =   -0.736  S(x) =   -0.682  f(x) =   -0.682  N =    5
x =   -0.573  S(x) =   -0.545  f(x) =   -0.545  N =    3
x =   -0.409  S(x) =   -0.399  f(x) =   -0.398  N =    2
x =   -0.245  S(x) =   -0.243  f(x) =   -0.243  N =    2
x =   -0.082  S(x) =   -0.082  f(x) =   -0.082  N =    1
x =    0.082  S(x) =    0.082  f(x) =    0.082  N =    1
x =    0.245  S(x) =    0.243  f(x) =    0.243  N =    2
x =    0.409  S(x) =    0.399  f(x) =    0.398  N =    2
x =    0.573  S(x) =    0.545  f(x) =    0.545  N =    3
x =    0.736  S(x) =    0.682  f(x) =    0.682  N =    5
x =    0.900  S(x) =    0.809  f(x) =    0.809  N =   10
Попробуй разобраться.

PS: Рисунок вставил, но как писать ниже рисунка не знаю.
Если табличные данные предварительно заданы для каких-то значений Х, то эти Х лучше и использовать в вычислениях. Тогда условием завершения вложенного цикла будет разность табличного и вычисленного значений (по модулю).
Изображения
Тип файла: png ObrGiperbolSinm.png (9.5 Кб, 22 просмотров)
Как-то так, ...
ViktorR на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра - викторина. Ошибки, ошибки, ошибки!.. three_cats Общие вопросы C/C++ 1 27.10.2012 21:47
Функция на Си, как именно она работает Алексей Денисов Помощь студентам 3 13.11.2011 20:16
В чем заключаются обязаности компьютерного аналитика? Linel Свободное общение 4 11.03.2011 19:05
C# работа с БД а именно с DataSet Jeid Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 18.08.2010 22:30