Перед непосредственно кодом нужно объяснить немного математики, а конкретно формирование суммы ряда.
Начнём с того, что в самом задании логическая ошибка. n-ый член ряда вычисляется по формуле
но в случае, если n=1, должно получится
В то время как мы видим, что в задании этот член ряда имеет положительный знак. Но мы будем следовать заданию и оставим его положительным, вынеся в отдельное условие.
Далее, каждый раз пересчитывать факториал до n-ного члена нерационально, поэтому нам нужно вывести формулу, которая будет считать следующий член ряда из предыдущего. В нашем случае мы должны будем постоянно домножать предыдущий член на некоторую постоянную функцию. Вот и найдём её. Во-первых, нам нужно обеспечить чередование знака, то есть если наша "константа" будет отрицательной, этого будет достаточно. Во-вторых, числитель дроби каждый раз увеличивается в x² раз, значит на это значение мы и будем домножать. Уже получилось -x². И в-третьих, знаменатель и тут нужно было быть чуть внимательнее, поскольку (2n)! ≠ (2(n-1))! * 2n. Выражение имеет другой вид (2n)! = (2(n-1))!*(2n-1)*2n
Итого имеем формулу n-ного члена в зависимости от n-1
Вот эту формулу мы и будем использовать для нахождения членов последовательности начиная со второго.
Получается вот такой код (см. ниже). А так же скриншот. Обратите внимание на отступы, потому как ваш код в задании, очень плохо читается. Учитесь сразу программировать красиво.
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
int main()
{
double a = 0.1, b=1.0, h=(b-a)/10.0, S,Y,x,p;
int i, n = 80;
x = a;
do
{
p = 1;
S = p;
for (i = 1; i <= n; i++)
{
if (i == 1) p *= pow(x, 2.0) / 2;
else p *= (-1) * pow(x, 2.0) / (2*i*(2*i - 1.0));
S += p;
}
Y = cos(x);
cout << setw(15) << x << setw(15) << Y << setw(15) << S << endl;
Метод поділу на підзадачі полягає в розбитті великої задачі на менші підзадачі, які можуть бути вирішені окремо, а потім об'єднані в загальне розв'язок. Цей підхід дозволяє зменшити складність задачі, спрощує її розв'язання та зменшує кількість помилок. Крім того, метод поділу на підзадачі дозволяє розподілити роботу між декількома людьми або командами, що прискорює вирішення задачі та збільшує ймовірність успіху. Наприклад, для вирішення задачі розробки програмного продукту може бути розбита на підзадачі розробки інтерфейсу, функціоналу, відладки та тестування, які можуть бути вирішені окремо, а потім об'єднані в один продукт.
Объяснение:
Перед непосредственно кодом нужно объяснить немного математики, а конкретно формирование суммы ряда.
Начнём с того, что в самом задании логическая ошибка. n-ый член ряда вычисляется по формуле
но в случае, если n=1, должно получится
В то время как мы видим, что в задании этот член ряда имеет положительный знак. Но мы будем следовать заданию и оставим его положительным, вынеся в отдельное условие.
Далее, каждый раз пересчитывать факториал до n-ного члена нерационально, поэтому нам нужно вывести формулу, которая будет считать следующий член ряда из предыдущего. В нашем случае мы должны будем постоянно домножать предыдущий член на некоторую постоянную функцию. Вот и найдём её. Во-первых, нам нужно обеспечить чередование знака, то есть если наша "константа" будет отрицательной, этого будет достаточно. Во-вторых, числитель дроби каждый раз увеличивается в x² раз, значит на это значение мы и будем домножать. Уже получилось -x². И в-третьих, знаменатель и тут нужно было быть чуть внимательнее, поскольку (2n)! ≠ (2(n-1))! * 2n. Выражение имеет другой вид (2n)! = (2(n-1))!*(2n-1)*2n
Итого имеем формулу n-ного члена в зависимости от n-1
Вот эту формулу мы и будем использовать для нахождения членов последовательности начиная со второго.
Получается вот такой код (см. ниже). А так же скриншот. Обратите внимание на отступы, потому как ваш код в задании, очень плохо читается. Учитесь сразу программировать красиво.
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
int main()
{
double a = 0.1, b=1.0, h=(b-a)/10.0, S,Y,x,p;
int i, n = 80;
x = a;
do
{
p = 1;
S = p;
for (i = 1; i <= n; i++)
{
if (i == 1) p *= pow(x, 2.0) / 2;
else p *= (-1) * pow(x, 2.0) / (2*i*(2*i - 1.0));
S += p;
}
Y = cos(x);
cout << setw(15) << x << setw(15) << Y << setw(15) << S << endl;
x += h;
}
while (x <= b + h / 2.0);
system("pause");
}
Метод поділу на підзадачі полягає в розбитті великої задачі на менші підзадачі, які можуть бути вирішені окремо, а потім об'єднані в загальне розв'язок. Цей підхід дозволяє зменшити складність задачі, спрощує її розв'язання та зменшує кількість помилок. Крім того, метод поділу на підзадачі дозволяє розподілити роботу між декількома людьми або командами, що прискорює вирішення задачі та збільшує ймовірність успіху. Наприклад, для вирішення задачі розробки програмного продукту може бути розбита на підзадачі розробки інтерфейсу, функціоналу, відладки та тестування, які можуть бути вирішені окремо, а потім об'єднані в один продукт.