valeramayshev
@valeramayshev
Студент,голодный,вредный,злой.

Как вычислить интеграл с помощью формулы Симпсона?

Помогите с решением задачи,не понимаю где использовать точность.Буду очень признателен,за помощь!
Задание, значения и формулу,загрузил скриншотами. Не знаю как тут математические формулы писать...
Задание:
5cc1b6d1b4fd2447732380.png
Формула:
5cc1b6db6c307837108199.png
Значения:
5cc1b6e418adb290289016.png
Код.
#include <iostream>
#include <math.h>
#include <windows.h>
using namespace std;
// функция, интеграл
double f(double x)
{
    return sin(x);
}
int main()
{
    setlocale(LC_ALL, "RUS");
    int i; 
    double Integral; 
    double a = 0.0, b = 1.0; 
    double h = 0.1;
 
    double n = 2; // задаём число разбиений n
 
    h = (b - a) / n;
 
    Integral = h * (f(a) + f(b)) / 3.0;
    for (i = 1; i <= n; i++)
        Integral = Integral + 4.0 / 3.0 * h * f(a + h * (i - 0.5));
    for (i = 1; i <= n - 1; i++)
        Integral = Integral + 2.0 / 3.0 * h * f(a + h * i);
    cout << "I3 = " << Integral << "\n";
 
    system("pause");
 
}

Что мне нужно исправить в коде,что бы задача была решена правильно...
  • Вопрос задан
  • 451 просмотр
Решения вопроса 2
@Mercury13
Программист на «си с крестами» и не только
Перед нами типичная студенческая работа.

Первое, что нужно сделать,— вынести расчёт интеграла в отдельную функцию. Помимо прочего, она должна принимать параметром n — количество точек разбиения. И проверьте, разумеется, работоспособность.

Затем поднимаемся на более высокий уровень — налаживаем алгоритм выдерживания точности. Я бы написал так.
n := 10
yНовое := расчёт(n)
повтор
  n := n·2
  yСтарое := yНовое
  yНовое := расчёт(n)
пока |yСтарое - yНовое| > эпсилон
вывести/вернуть yНовое

Сможешь перевести на Си?
Ответ написан
Комментировать
valeramayshev
@valeramayshev Автор вопроса
Студент,голодный,вредный,злой.
#include <iostream>
#include <math.h>
#include <cmath>
using namespace std;
typedef double(*pointFunc)(double);
double f(double x) {
	return cos(x*x);
}
double simpson_integral(pointFunc f, double a, double b, int n) {
	const double h = (b - a) / n;
	double k1 = 0, k2 = 0;
	for (int i = 1; i < n; i += 2) {
		k1 += f(a + i * h);
		k2 += f(a + (i + 1) * h);
	}
	return h / 3 * (f(a) + 4 * k1 + 2 * k2);
}
int main() {
	setlocale(LC_ALL, "RUS");
	double a, b, eps;
	double s1, s;
	int n = 1; //начальное число шагов
	cout << "Введите левую границу интегрирования a = ";
	cin >> a;
	cout << "\nВведите правую границу интегрирования b = ";
	cin >> b;
	cout << "\nВведите требуемую точность eps = ";
	cin >> eps;
	s1 = simpson_integral(f, a, b, n); //первое приближение для интеграла
	do {
		s = s1;     //второе приближение
		n = 2 * n;  //увеличение числа шагов в два раза,

		s1 = simpson_integral(f, a, b, n);
	} while (fabs(s1 - s) > eps);  //сравнение приближений с заданной точностью
	cout << "\nИнтеграл = " << s1 << endl;
}

Если кому надо... Код не мой,я просто адаптировал его под задание...
Всем спасибо за помощь,усердие,мотивацию! Особенно порадовал Roman, еще раз спасибо!
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы