Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > функция интеграла где?


Автор: Helicopterr 3.1.2006, 12:14
Подскажите есть ли функция решения определённого интеграла на Си++? И как вообще это можно сделать. В math.h ни интегралов ни лимитов нет...

Автор: pablo 3.1.2006, 12:21
Если я не ошибаюсь, то для вычистления определённого интеграла можно использовать численные методы(например метод Монте-Карло). Математическая библиотека С++ таковых не имеет. smile

Автор: Exekutor 3.1.2006, 12:23
Сам напиши, в чем проблема?

Автор: Artiom 3.1.2006, 13:04
Если это задание по лабораторной - то самое простое использовать метод прямоугольников. разбить интервал, в котором считаешь на много мелких отрезков и считать площадь прямоугольников. одна сторона - ширина мелкого отрезка, вторая - значение функции в точке посередине отрезка

Автор: Helicopterr 3.1.2006, 20:33
Цитата(Exekutor @ 3.1.2006, 12:23)
Сам напиши, в чем проблема?

1) Конечный вид интеграла на момент компиляции неизвестен
2) Решить надо будет тысяч 10 интегралов желательно за пару секунд
3) Интеграл из тех, что наш математик называет поросятами

Самому такую функцию разрабатывать элементарно лень smile Должны быть либы вот только где их взять...

Автор: _hunter 3.1.2006, 20:47
ну так у MatLAB' а библиотеки бери -- они ( AFAIK ) бессплатны ( для некомерческого использования )

Автор: sergejzr 3.1.2006, 20:51
Цитата(Helicopterr @ 3.1.2006, 19:33)
Должны быть либы вот только где их взять...

А как ты себе либу представляешь? Для этого в ней должен быть предопределён синтакс определения функций, точность, разрешение и ещё много чего. такая либа быстро разрастётся в программу. Но всё это есть в матлабоподобных приложениях, поэтому писать либы под С++ смысла мало.

Артём правильно сказал - прямоугольники...

Автор: Дрон 3.1.2006, 20:53
Наш математик говорил, что много подобных библиотек написано на Фортране, а вот на Си как-то не очень.
Попробуй зайди здесь в раздел Алгоритмы и там в закреплённых темах есть ссылки на сайты, где вполне могут быть исходники на Си для похожих задач.

Цитата(Helicopterr @ 3.1.2006, 20:33)
Конечный вид интеграла на момент компиляции неизвестен

А вот это уже другая задача. Для начала надо определиться как будет задаваться интеграл.

ЗЫ:
Цитата(Helicopterr @ 3.1.2006, 20:33)
Интеграл из тех, что наш математик называет поросятами

И откуда нам знать, что ваш математик называет поросятами smile

Автор: Helicopterr 5.1.2006, 03:14
Фак постоянно у меня на этом форуме ник слетает

да, конечно, поросята - это большие формулы на всю доску. Вот так.
Некто Johna Smith предложил так реализовывать метод прямоугольников

Код

#include "stdafx.h"


double func(double x)
{
return -(x - 26)*(x - 26) / 2.0 * 9.4; //функция под интегралом для примера
}


double Integrate(double x1, double x2, double step) // функция дяди Johna
{
double x=x1;
double I=0; // integral value

while (x<x2-step)
{
// calculating function at the halfpoint of interval
I+=step*func(x+step/2);
x+=step;
}

return I;
}

void main(void)
{
printf("I=%f",Integrate( 1.0, 25.0,1e-4)); // интеграл от 1 до 25
}

//вывод:
//-24477.6000
//а правильно:
//-277.021


Короче считает неправильно. Кто-нибудь видит ошибку?

Автор: Mephistopheles 5.1.2006, 05:55
Какой метод треугольника? Фигня всё это.
Самый простой и нагрузочный для камнявариант - методом разбиения.
Второй - метод Монте - Карло.
Был ещё какой-то более быстрый. Если надо - гляну.

Автор: volvo877 5.1.2006, 10:06
Цитата(Helicopterr @ 5.1.2006, 02:14 Найти цитируемый пост)
//вывод:
//-24477.6000
//а правильно:
//-277.021

Это с чего ты взял, что правильно = -277.021? Для заданной тобой функции как раз ответ верный... Чтобы получалось -277.021 функция должна быть такой:
Код
double func(double x)
{
return -(x - 26)*(x - 26) / (2.0 * 9.4); // Чувствуешь разницу ?
}

Автор: Helicopterr 5.1.2006, 23:26
volvo877
Спасибо не заметил! GOOD! Остался только один вопрос. Там double x2 - верхний предел интеграла, а как быть если у меня верхний предел бесконечность?

Автор: Partizan 5.1.2006, 23:32
Helicopterr, у вас курс высшей математики был?...
Такие интегралы, насколько я помню называются несобственными.....и записываются с помощью пределов....

З.ы. Да...и кстати...если функция не ограничена на числовой прямой, думаю очевидно, что невозможно указать точное значение несобственного интеграла...

Автор: Void 5.1.2006, 23:33
Helicopterr
Один вопрос (почти праздный): какого рода подинтегральные функции, хотя бы приблизительно: полиномы, рациональные, трансцедентные, что еще похуже?

Автор: Helicopterr 5.1.2006, 23:54
Void вот прикрепляю,
видимо действительно придётя представлят как предел и раскладывать в ряд а потом рекурсией...

Автор: Void 6.1.2006, 00:03
Helicopterr
Функция оказалась серьезнее, чем я предполагал smile
Цитата(Helicopterr @ 6.1.2006, 01:54 Найти цитируемый пост)
ридётя представлят как предел и раскладывать в ряд а потом рекурсией...

Цитата(Helicopterr @ 3.1.2006, 22:33 Найти цитируемый пост)
2) Решить надо будет тысяч 10 интегралов желательно за пару секунд

Успеешь? Сначала аналитически до функции, не зависящей от x, довести никак нельзя?

Автор: ST1 6.1.2006, 17:49
Господин Smith все-таки прав (вернее его программа): правильный ответ все-таки -24479,1(6) (в пределах ошибки аппроксимации)
Вот здесь глянь сорсы:
1) http://www.srcc.msu.su/num_anal/lib_na/cat/cat7.htm - Каталог БЧА НИВЦ МГУ. Численное интегрирование
2) netlib.org, gams.nist.gov, www.nr.com -- бибилиотеки численных "рецептов"
3) http://rtf.tsure.ru/~lyashev/links.php - в разделе Numerical Integration and Harmonic Analysis
Вообще совет - ищи англоязычные ресурсы (в рунете мало ценного на тему численногог анализа)

Автор: profispb 6.1.2006, 17:53
Самое простое методом Симпсона. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)