
C/C++
Помогите составить алгоритм вычисления функции:

Выражение под знаком суммы можно преобразовать:
y=Σ(i=1;n)(a²-9+9+3i)/(3+i)=
3n+(a²-9)Σ(i=4;n+3)1/i -так удобнее будет считать циклом.
А сам алгоритм такой: вводятся два числа a и n. Если а=±3, то y=3n, иначе инициируем сумму нулём и в цикле от i=4 до i=n+3 прибавляем к текущей сумме 1/i, а после вычисления суммы умножаем её на a²-9, к произведению прибавляем 3n и весь результат присваивается у. Всё, функция у вычислена.
Но можно ещё заметить, что Σ(i=4;n+3)1/i -это S(n+3)-11/6, где S(k) -сумма ограниченного гармонического ряда от одного до k включительно. И если k -большое число, то лучше воспользоваться асимптотическим разложением ограниченной суммы гармонического ряда, которая находится практически мгновенно, а не выполнять цикл для расчёта S(k), например, при k=100000000000, что черезчур неэкономно.
Но если всё таки надо обязательно алгоритм с циклом, то вот как его записать в коде C++:
#include <iostream>
using namespace std;
int main()
{
double a, i, n, s, y;
cout.precision(16);
cout << "a n: ";
cin >> a >> n;
y = 3 * n;
if (a == 3 || a == -3) cout << y << endl;
else
{
s = 0.;
for (i = n + 3; i > 3; i--) s += 1. / i;
y += s * (a * a - 9.);
cout << y << endl;
}
system("pause > nul");
return 0;
}
Тут вычисление y происходит в основной функции main, а если надо сделать отдельную от основной функцию y(a,n), то нетрудно всё переписать и для отдельной функции.
y=Σ(i=1;n)(a²-9+9+3i)/(3+i)=
3n+(a²-9)Σ(i=4;n+3)1/i -так удобнее будет считать циклом.
А сам алгоритм такой: вводятся два числа a и n. Если а=±3, то y=3n, иначе инициируем сумму нулём и в цикле от i=4 до i=n+3 прибавляем к текущей сумме 1/i, а после вычисления суммы умножаем её на a²-9, к произведению прибавляем 3n и весь результат присваивается у. Всё, функция у вычислена.
Но можно ещё заметить, что Σ(i=4;n+3)1/i -это S(n+3)-11/6, где S(k) -сумма ограниченного гармонического ряда от одного до k включительно. И если k -большое число, то лучше воспользоваться асимптотическим разложением ограниченной суммы гармонического ряда, которая находится практически мгновенно, а не выполнять цикл для расчёта S(k), например, при k=100000000000, что черезчур неэкономно.
Но если всё таки надо обязательно алгоритм с циклом, то вот как его записать в коде C++:
#include <iostream>
using namespace std;
int main()
{
double a, i, n, s, y;
cout.precision(16);
cout << "a n: ";
cin >> a >> n;
y = 3 * n;
if (a == 3 || a == -3) cout << y << endl;
else
{
s = 0.;
for (i = n + 3; i > 3; i--) s += 1. / i;
y += s * (a * a - 9.);
cout << y << endl;
}
system("pause > nul");
return 0;
}
Тут вычисление y происходит в основной функции main, а если надо сделать отдельную от основной функцию y(a,n), то нетрудно всё переписать и для отдельной функции.
Ilgar Abdullayev
Можете пожалуйста с этим помочь еще?

Виктор Рыбин
И ещё есть такое соображение: допустим n=∞, тогда этому бесконечному и явно расходящемуся ряду можно приписать некую обобщённую сумму. В моём первом здесь заданном вопросе речь как раз шла о вычислении таких сумм. Там в комментариях даже программа приведена для расчёта обобщённой суммы ряда cos1+cos2+cos3+..., который, естественно, расходится, но его обобщённая сумма тем не менее существует и представляет из себя вполне конкретное конечное число. Так вот, когда я взяла ту программу и заменила в ней cos на sin(i²+3•b), чтобы проверить наличие обобщённой сходимости, то её почему-то не обнаружилось. Но это так -можно сказать ни о чём! n же, наверное, тут предполагается всё же конечным, а сумма -обычной, а не обобщённой...
Похожие вопросы
- Составьте алгоритм и напишите программу вычисления суммы n членов ряда согласно условию задачи
- Помогите ускорить алгоритм
- Помогите реализовать алгоритм на С++
- Циклические алгоритмы. «Разложение функций» на языке Си
- Помогите решить алгоритм на с++
- Помогите решить задачу, c++, функции
- Задача на с++. Нужно составить алгоритм и написать программу
- Пожалуйста, помогите понять как написать функцию (С)
- Помогите разобраться в коде функций C++
- Помогите составить программу на Visual Studio C++