C/C++

Перевести математическое уравнение в С

Все эти формулы всегда надо тщательно проверять -в них нередко бывают ошибки, поэтому у меня внизу кроме вычисления суммы по указанной формуле сначала этот определённый интеграл вычисляется достаточно точным численным методом Симпсона.
#include <cmath>
#include <iostream>
using namespace std;
double f(double x)
{ return cos(x * x); }
int main()
{ double a, b, x, h, hp,
u, v, i, n, s, p, k, e, eps;
cout.precision(17); while (true)
{ cout << "a b n eps » "; cin >> a
>> b >> n >> eps; h = (b - a) / n;
hp = h / 2; u = f(b - hp); v = 0;
s = p = 1; k = 0; e = 1e303;
for (i = 1; i < n; i++) {
x = a + i * h; u += f(x - hp);
v += f(x); } cout << "S = " <<
(f(a)+f(b)+4*u+2*v)*h/6 << endl;
while (fabs(e) > eps) { k+=2;
p *= -1 / (k * (k - 1));
e = p / (2 * k + 1); s += e;
cout << k / 2 << ") " << s << endl; } } }
Результат работы этой программы -на скрине. Как видно, для вычисления значения интеграла понадобилось всего 10 слагаемых, так что K получилось равным девяти, а количество равномерных интервалов в методе Симпсона задавалось равным тысяче. И обе вычисленные двумя разными способами интегральные суммы получаются очень близкими. После проверки всё лишнее можно убрать, а оставить только это:
#include <cmath>
#include <iostream>
using namespace std; int main()
{ double s, p, k, e, eps; cout.precision(17);
while (true) { cout << "eps » "; cin >> eps;
k = 0; e = 1e303; s = p = 1.; while (fabs(e) > eps)
{ k += 2; p *= -1. / (k * (k - 1.)); e = p / (2. * k + 1.);
s += e; cout << k / 2. << ") " << s << endl; } } }
При помощи разложения в ряд всё вроде лучше получается -быстрее, экономичней и надёжней.
Сергей Веретенников
Сергей Веретенников
66 572
Лучший ответ