@tr1ck

Как вычислить интеграл методом трапеции (С++ and scilab)?

Начну по порядку. Есть интеграл от функции f(x) =2x/sqrt(1-x^4) с границами от 0 до 1. Посчитать с точностью E=10^(-9). Собственно вопрос, что за точность и как ее прописать в коде? Что делать с границей 1? Ведь при 1 => 'inf'. Преподаватель сказал отнять какое-то минимальное число p, чтобы не была 1, но тогда нужно изменить точность E и она будет равна, как Е(начальное) + E(p), так? И как это в кое прописать, не особо разобрался с этой точностью, вот мой код, довольно легкий в понимании:
#include "stdafx.h"
#include
#include
#include

using namespace std;

float f(float x)
{
return 2 * x / sqrt (1-x*x*x*x);
//return x / exp(x);
}

int _tmain(int argc, _TCHAR* argv[])
{
float a = 0, b = 0.9999999, n = 4, S = 0, h, integ;
h = (b - a) / n;
for (int i = 1; i <= (n - 1); i++)
S += f(a + h*i);
integ = h * ((f(a) + f(b)) / 2 + S);
cout << integ;
getchar();;
return 0;
}
И второй вопрос, на scilab это тяжело перенести?) Ни разу не пользовался им еще, а время пожимает)
  • Вопрос задан
  • 3603 просмотра
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Мда... С точностью Вы точно не разобрались. Надо добавить ещё один внешний цикл, в котором количество шагов разбиения n будет увеличиваться до тех пор, пока изменение значения интеграла между предыдущей и текущей итерациями цикла не станет меньше заданной точности.
n = 2;
I = (f(a)+f(b))/2*(b-a);
do {
    Iprev = I;
    // здесь считаем интеграл I при разбиении на n отрезков
    n++;
} while (abs(Iprev-I) > precision);
Ответ написан
Ну с погрешностями есть два варианта:
1. точная априорная оценка, не твой случай, просто потому что 1 - точка разрыва, чем ближе к ней, тем больше становятся производные и оценка опять же даст бесконечность;
2. последовательно уменьшать шаг интегрирования (делить пополам) и смотреть на разность полученных результатов текущего и предыдущего шага, как только разность будет укладываться в погрешность можно остановиться - так делают, если нет лучших вариантов.

Касательно верхней границы, то я не думаю, что требуется учитывать эту погрешность при подсчетах, просто потому что оценка погрешности по 2 варианту и так неточная. Но ты можешь опять же отступ от верхней границы итеративно уменьшать, пока разность между итерациями не станет достаточно маленькой.

UPD. По поводу переноса в scilab, судя по всему все довольно топорно:

www.ibm.com/developerworks/ru/library/l-scilab1
Ответ написан
Ваш ответ на вопрос

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

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