C/C++

Программа на С++

Нужна помощь, лабораторная по программированию, как я понимаю значения, которые красным подчеркнуты должны совпадать. Но как это сделать, я не понимаю, если поможете, буду благодарен.
Условие задачи прикреплено.

#include
#include

using namespace std;

int main() {
SetConsoleOutputCP(1251);

double x;
std::cout << "Введите значение x в диапозоне (-1, 1): \n";
std::cin >> x;
if ((x <= -1) || (x >= 1)) {
do {
std::cout << "Введите значение x в диапозоне (-1, 1): \n";
std::cin >> x;
} while ((x >= 1) || (x <= -1));
}
int n;
std::cout << "Введите количество слагаемых: \n";
std::cin >> n;

double y = 1;
double s = y;
for (int i = 1; i <= n; ++i) {
y = y * (2 * i - 1) * x * x / (2 * i);
s = s + y;
}

std::cout << "Сумма " << n << " слагаемых = " << s << endl;

double e = 0.001;
n = 0;
y = 1;
s = y;
while (abs(y) > e) {
n = n + 1;
y = y * (2 * n - 1) * x * x / (2 * n);
s = s + y;
}

std::cout << "При точности 0.001 сумма = " << s << ". Количество слагаемых = " << n+1 << endl;

e = 0.0001;
n = 0;
y = 1;
s = y;
while (abs(y) > e) {
n = n + 1;
y = y * (2 * n - 1) * x * x / (2 * n);
s = s + y;
}

std::cout << "При точности 0.0001 сумма = " << s << ". Количество слагаемых = " << n+1 << endl;

std::cout << "Решение \n";
std::cout<< 1.0 / sqrt(1.0 - x * x);

return 0;
}

#include <iostream>
#include <iomanip>
using namespace std;
double modd(int n, double m = 1.0) {
if (~n & 1) --n;
if (n > 0) m *= n;
else return m;
return modd(n - 2, m);
}
double meven(int n, double m = 1.0) {
if (n & 1) --n;
if (n > 0) m *= n;
else return m;
return meven(n - 2, m);
}
double value(const char* msg) {
auto x = 1.0;
while (x <= -1.0 || x >= 1.0) {
cout << msg;
cin >> x;
cin.ignore(cin.rdbuf()->in_avail());
}
return x;
}
unsigned quantity(const char* msg) {
auto value = 0U;
while (value < 1 || value > 151) {
cout << msg;
cin >> value;
cin.ignore(cin.rdbuf()->in_avail());
}
return value;
}
void show(double e, unsigned n, double sum, streamsize w) {
cout
<< "При заданной точности: " << setprecision(w) << e << '\n'
<< "Количество слагаемых: " << n << '\n'
<< "Сумма ряда равна: " << setprecision(15) << sum << "\n\n";
}
int main() {
system("chcp 1251 > nul");
auto x = value("Введите значение x в диапазоане (-1; 1): ");
auto n = quantity("Введите количество слагаемых: ");
auto c0 = 1U;
auto s0 = 1.0;
const auto e1 = 1e-3;
auto c1 = 1U;
auto s1 = 1.0;
const auto e2 = 1e-4;
auto c2 = 1U;
auto s2 = 1.0;
auto i = 2;
while (true) {
auto m = modd(i) / meven(i) * pow(x, i);
if (c0 < n) {
s0 += m;
++c0;
}
if (fabs(m) > e1) {
++c1;
s1 += m;
}
if (fabs(m) > e2) {
++c2;
s2 += m;
}
if (c0 >= n && fabs(m) <= e2) break;
i += 2;
}
auto solution = 1.0 / sqrt(1.0 - pow(x, 2));
cout.setf(ios::fixed);
cout << "\nСумма " << c0 << " слагаемых: " << setprecision(15) << s0 << "\n\n";
show(e1, c1, s1, 3);
show(e2, c2, s2, 4);
cout << "Решение: " << setprecision(15) << solution << endl;
system("pause > nul");
}
Аскар .
Аскар .
88 214
Лучший ответ
Алексей Мехедов Спасибо, но это слишком "заумно". Я 1 курс только, и с c++ не очень знаком, поэтому такое решение, лично для меня не подойдет, но для других может быть полезно.
Нет, совпадать они НЕ должны. Сумма ряда ВСЕГДА отличается от точного значения.
Но разница между точностью 0.001, 0.0001 и точным значением у тебя великовата.
~I
~T.a.[ Inferno]~
65 470
Алексей Мехедов Можете подсказать, как исправить?
Алексей Мехедов Хорошо, попробую, спасибо
Запустим такую программу:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std; int main()
{ double e, p, q, s, x, xx; while (true)
{ cout << "x » "; cin >> x; xx = x * x; q = 0.;
p = s = 1.; while (p / s > 1e-20)
{ q += 2.; p *= xx * (1. - 1. / q); s += p; }
printf("%20.16g%14.4e%14d\n", s,
s - 1. / sqrt(1. - xx), (int) q / 2 + 1); } }
И смотрим результаты (которые ниже на скрине !). При х→±1 сумма ряда получается всё менее точной в сравнении со значением функции ¹/√(1-x²). Однако поскольку выход из цикла заказан при пренебрежимо малом очередном слагаемом, то даже при х=0.99999999 ошибка получается меньше чем 1е-4. А если вместо типа double ещё и заказать тип long double, то результаты сразу же намного улучшатся. Так что если очень большая точность не нужна, а нужно всего лишь точное значение количество членов ряда при котором заказываемая точность (типа 1е-3 или 1е-4, или может быть даже 1е-5 или 1е-6) выполняется, то надо просто сделать два цикла: первый примерно как у меня в коде - он будет вычислять "истинное" значение функции, а второй такой же цикл, условием выхода из которого будет модуль разности (между вновь вычисляемой суммой ряда и уже вычисленным "истинным" значением функции !) меньший заказанной точности, вычислять необходимое количество слагаемых. Вот и всё! А иначе действительно трудно определять количество слагаемых, необходимых для получения заданной точности, если только для этого не воспользоваться сравнением со значением самой функции ¹/√(1-х²), что вроде бы как не запрещено́!.
。◕‿◕。
Сергей Бурцев
Сергей Бурцев
29 440