Top.Mail.Ru
Ответы

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

Добрый день, несколько часов уже пытаюсь решить данную задачу на языке С++. Может тут есть знатоки, которые помогут написать код для решения этого задания?

По дате
По рейтингу
Аватар пользователя
Новичок

В методе Симпсона ошибка ε~h⁴, где шаг интегрирования h=(b-a)/n - это длина отрезка интегрирования, делённая на количество интервалов, поэтому целесообразно количество интервалов брать порядка 1/⁴√ε.
sin(x)•cos(x) - это половина удвоенного синуса
Точное значение интеграла:
I=0,1853760679884347837248...
Поэтому запускаем проверочную программу:

1234567891011121314151617181920212223242526272829
 #include <cmath> 
#include <iostream> 
 
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; 
    } 
} 

И смотрим результаты, особое внимание уделяя относительной ошибке вычислений:

Всё прекрасно работает - фактическая точность нигде не хуже требуемой точности вводимой с клавиатуры! Теперь оставляем в программе только самое необходимое:

12345678910111213141516
 #include <cmath> 
#include <iostream> 
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. А остальные ответы (особенно у Высшего Тролля !) - это не более чем первоапрельские шутки!

Аватар пользователя
Высший разум
1234567891011121314151617181920
 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);
} 
Удаленный ответ Ответ удалён
Удаленный ответ Ответ удалён