Нужна помощь, лабораторная по программированию, как я понимаю значения, которые красным подчеркнуты должны совпадать. Но как это сделать, я не понимаю, если поможете, буду благодарен.
Условие задачи прикреплено.
#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");
}
Нет, совпадать они НЕ должны. Сумма ряда ВСЕГДА отличается от точного значения.
Но разница между точностью 0.001, 0.0001 и точным значением у тебя великовата.
Запустим такую программу:
#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-х²), что вроде бы как не запрещено́!.
。◕‿◕。
