Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Программирование С++ Решение поставленной задачи

Богдан Бекиров Знаток (355), закрыт 12 месяцев назад
Добрый день, несколько часов уже пытаюсь решить данную задачу на языке С++. Может тут есть знатоки, которые помогут написать код для решения этого задания?
Лучший ответ
Ксения Райт Гений (82290) 12 месяцев назад
В методе Симпсона ошибка ε~h⁴, где шаг интегрирования h=(b-a)/n - это длина отрезка интегрирования, делённая на количество интервалов, поэтому целесообразно количество интервалов брать порядка 1/⁴√ε.
sin(x)•cos(x) - это половина удвоенного синуса
Точное значение интеграла:
I=0,1853760679884347837248...
Поэтому запускаем проверочную программу:
 #include  
#include

using namespace std;

double Simpson(double (*f)(double),
double a, double b, double eps)
{
double i, n = (int)((b - a) / sqrt(sqrt(eps))),
h = (b - a) / n, hp = h * 0.5, u = f(b - hp), v = 0., x;
for (i = 1.; i < n; i += 1.)
{ x = a + i * h; u += f(x - hp); v += f(x); }
return (f(a) + f(b) + 4. * u + 2. * v) * h / 6.;
}

double f(double x)
{ return 0.5 * sin(2. * x) / (1. + x * (1. + x)); }

int main()
{
cout.precision(16);
double a, b, eps, I, S = 0.1853760679884347837;
while (true)
{
cout << "\033[1meps: "; cin >> eps;
I = Simpson(f, 0., 1., eps);
cout << I << ", err=" << I / S - 1. << endl;
}
}
И смотрим результаты, особое внимание уделяя относительной ошибке вычислений:Всё прекрасно работает - фактическая точность нигде не хуже требуемой точности вводимой с клавиатуры! Теперь оставляем в программе только самое необходимое:
 #include  
#include
using namespace std;
double Simpson(double (*f)(double),
double a, double b, double eps)
{ double i, n = (int)((b - a) / sqrt(sqrt(eps))),
h = (b - a) / n, hp = h * 0.5, u = f(b - hp), v = 0., x;
for (i = 1.; i < n; i += 1.)
{ x = a + i * h; u += f(x - hp); v += f(x); }
return (f(a) + f(b) + 4. * u + 2. * v) * h / 6.; }
double f(double x)
{ return 0.5 * sin(2. * x) / (1. + x * (1. + x)); }
int main()
{ cout.precision(16); double a, b, eps, I;
cout << "eps: "; cin >> eps;
cout << Simpson(f, 0., 1., eps) << endl; }
P.S. А остальные ответы (особенно у Высшего Тролля !) - это не более чем первоапрельские шутки!
Остальные ответы
Андрей Высший разум (421999) 12 месяцев назад
 double func(double x) { return sin(x) * cos(x) / (x * x + x + 1); }

double simpson(double (*f)(double), double a, double b, double e) {
double s = 0.0, s0, h = b - a;
double f0 = f(a) + f(b), f2 = 0.0;
do {
double f4 = 0.0;
for (double x = a + h / 2.0; x < b; x += h) { f4 += f(x); }
s0 = s;
s = (f0 + 2.0 * f2 + 4.0 * f4) * (h /= 2.0) / 3.0;
f2 += f4;
} while (fabs(s - s0) >= e);
return s;
}

int main(void) {
double eps;
cin >> eps; // вводим заданную точность
cout << simpson(func, 0.0, 1.0, eps);
}
Богдан БекировЗнаток (355) 12 месяцев назад
спасибо!
Похожие вопросы