Русское сообщество AutoIt

  • Май 18, 2013, 20:18:43 *
  • Добро пожаловать, Гость
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  

Новости:

Создана конференция в Jabber'е для обсуждения мелких вопросов касающихся AutoIt.

Всем у кого есть джаббер-клиент, могут присоединиться к конференции по адресу xmpp:autoit@conference.jabber.ru

Комната/Конференция/Чат не призвана заменить этот форум, а лишь для ускорения получения ответов на элементарные и короткие вопросы, которые возможно не требуют создания специальной темы на данном форуме. Для всех остальных, сколь-нибудь сложных и комплексных проблем - исключительно на форум. Комната является постоянной, но при заходе у пользователя будет отсутствовать право писать в общий чат.

Тема на форуме.

Реклама

Автор Тема: [Математика] вычисление интегралов  (Прочитано 2021 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Arei [?]

  • Скриптер
  • ****
  • Репутация: 113
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 929
  • Награды Второе место конкурса
    • Награды
Скажите пожалуйста есть ли код для вычисления  интеграла  в автоите.Заранее спасибо.


Добавлено: Ноябрь 17, 2010, 17:31:53
Я про библиотеку какую нибудь.
« Последнее редактирование: Ноябрь 19, 2010, 10:49:42 от Kaster, Причина: Объединение сообщений »



  Записан

Kaster [?]

  • Глобальный модератор
  • Бритва, Бритва Оккама
  • *
  • *****
  • Репутация: 581
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 3751
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
[Математика] вычисление интегралов
« Ответ #1, Отправлен: Ноябрь 17, 2010, 17:33:16 »
Arei
берешь любой приближенный алгоритм нахождения интеграла и вычисляешь :)
готовой функции нет.




  Записан
Конференция посвященная AutoIt на jabber.ru - autoit@conference.jabber.ru
Как попасть на конференцию читаем тут
Продолжать дискуссию в теме отмеченной как "Решенная" - моветон.
Банхамером не обладаю, так что расслабьтесь ;)
Банхамером обладаю, так что не расслабляться :Ban:

Arei [?]

  • Скриптер
  • ****

  • Автор темы
  • Репутация: 113
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 929
  • Награды Второе место конкурса
    • Награды
[Математика] вычисление интегралов
« Ответ #2, Отправлен: Ноябрь 17, 2010, 17:39:41 »
вот именно что я не знаю да же приближенно как можно сделать.Можете помочь примером пожалуйста.заранее спасибо.Уважаемые форумчане




  Записан

Kaster [?]

  • Глобальный модератор
  • Бритва, Бритва Оккама
  • *
  • *****
  • Репутация: 581
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 3751
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
[Математика] вычисление интегралов
« Ответ #3, Отправлен: Ноябрь 17, 2010, 18:16:12 »
Выбирай любой - Численное интегрирование
OffTopicА вообще странно, зачем тебе понадобилось считать интегралы, если ты не в курсе как считать его приближенно :-\




  Записан

Arei [?]

  • Скриптер
  • ****

  • Автор темы
  • Репутация: 113
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 929
  • Награды Второе место конкурса
    • Награды
[Математика] вычисление интегралов
« Ответ #4, Отправлен: Ноябрь 17, 2010, 18:33:58 »
Спасибо,но тема не закрыта если кто то сможет, то жду примера.Заранее спасибо.




  Записан

shm_alex [?]

[Математика] вычисление интегралов
« Ответ #5, Отправлен: Ноябрь 18, 2010, 21:36:21 »
Спасибо,но тема не закрыта если кто то сможет, то жду примера.Заранее спасибо.
Мне задача не понятна Какие входные данные , какие выходные. Что такое вычисление интеграла? Численное решение? или нужна формула ?
надо сказать что число пи наример, непредставимо  действительным числом, а тем более числом float , double и т.д.
При  при численном интегрировании неизбежны ошибки не только в предсатвлении функции , расчёте интеграла, формировании ответа и так далее.
Более того  увидев в ответе число 4,9348022005446793094172454999381 вы с трудом поймёте что это приблежение числа PI^2/2 максимально представимое в дабл арифметике.Можно наверно прикрутить к AutoIt например бесплатную Maxima http://maxima.sourceforge.net/ru/ (Система символьных вычислений) ей передавать данные и их выводить .
В общем задача непонятна. А чтобы что то  и как то  считать в AutoIt есть все средства.
Грамотно поставленная задача 90% от её решения.




  Записан

Kaster [?]

  • Глобальный модератор
  • Бритва, Бритва Оккама
  • *
  • *****
  • Репутация: 581
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 3751
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
[Математика] вычисление интегралов
« Ответ #6, Отправлен: Ноябрь 19, 2010, 05:32:51 »
Вот одна из реализаций метода прямоугольников
Код: AutoIt [Выделить]
$a = 0; Левая граница интервала
$b = 1; Правая
$y = 'Sin(x)'; Функция (только "x" - в качестве аргумента)

Func yVal($y, $x)
    Return Execute(StringReplace($y, "x", $x))
EndFunc

Func integral($y, $a = 0, $b = 1, $e = 1e-6); $y - функция, $a, $b - границы, $e - точность вычислений
    $N = 2; Начальное кол-во интервалов
    $iInt_old = 1/0; Начальное значение инеграла (бесконечность)
    Do
        $h = ($b - $a)/$N; Шаг интегрирования
        $iSum = 0
        For $i = 1 to $N
            $x = $a + $i*$h - $h/2;
            $iSum += yVal($y, $x)*$h
        Next
        $iDiff = Abs($iSum - $iInt_old); Разница вычислений на каждом шаге по сравнению с предыдущим
        $iInt_old = $iSum
        $N += 1
    Until $iDiff < $e; Конец вычислений, если разница стала меньше точности вычислений
    Local $retvals[3] = [Round($iInt_old, 5), $N - 2, Round($iDiff, 5)]; Возвращаемый массив из [значения интеграла, кол-ва итераций, локальной ошибки]
    Return $retvals
EndFunc

$val = integral($y, -1, 1)
MsgBox(64, "Определенный интеграл", "Значение интеграла от функции y(x) = " & $y & " равно " & $val[0] & @CRLF & _
"Количество итераций для вычислений - " & $val[1] & @CRLF & _
"Ошибка составила - " & $val[2])
 
« Последнее редактирование: Ноябрь 19, 2010, 06:09:04 от Kaster »



  Записан

shm_alex [?]

[Математика] вычисление интегралов
« Ответ #7, Отправлен: Ноябрь 19, 2010, 08:05:56 »
Код: AutoIt [Выделить]
$a = 0; Левая граница интервала
$b = 1; Правая
$y = '1/sqrt(x)'; Функция (только "x" - в качестве аргумента)

Func yVal($y, $x)
    Return Execute(StringReplace($y, "x", $x))
EndFunc

Func integral($y, $a = 0, $b = 1, $e = 1e-6); $y - функция, $a, $b - границы, $e - точность вычислений
    $N = 2; Начальное кол-во интервалов
    $iInt_old = yVal($y, ($b-$a)/2)*($b-$a); Начальное значение интеграла
    Do
        $h = ($b - $a)/$N; Шаг интегрирования
        $iSum = 0
        $x=$a+$h/2;добавил начальное значение х в которой считать первую среднюю линию трапеции
        For $i = 1 to $N
            ;$x = $a + $i*$h - $h/2;
            $x+=$h;Заменил чтобы в цикле не умножать много раз $i*$h
            ;$iSum += yVal($y, $x)*$h
            $iSum += yVal($y, $x);сначало посчитаем сумму вскобках чтобы 100 раз не умножать в цикле и не накапливать ошибку вынесем высоту трапеции h за скобки
        Next
        $iSum*=$h ; зделаем умножение за скобками
        $iDiff = Abs($iSum - $iInt_old); Разница вычислений на каждом шаге по сравнению с предыдущим
        $iInt_old = $iSum
        $N += 1
    Until $iDiff < $e; Конец вычислений, если разница стала меньше точности вычислений
    Local $retvals[3] = [Round($iInt_old, 5), $N - 2, Round($iDiff, 5)]; Возвращаемый массив из [значения интеграла, кол-ва итераций, локальной ошибки]
    Return $retvals
EndFunc

$val = integral($y,0,4)
MsgBox(64, "Определенный интеграл", "Значение интеграла от функции y(x) = " & $y & " равно " & $val[0] & @CRLF & _
"Количество итераций для вычислений - " & $val[1] & @CRLF & _
"Ошибка составила - " & $val[2])
 
немного я бы изменил код,
по-поводу алгоритма
он действительно что-то  считает
но вот прикольную функцию предлагаю проинтегрировать этим методом
1/(sqrt(x)) от 0 до 1 легко видеть что аналитически вычисленый интеграл равен 2 а вот алгоритм походу расходится.. (впадает в бесконечный цикл- тк f(0)- стремится к бесконечности а вот первооразная в нуле - конечное число ))) )



Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Ноябрь 19, 2010, 08:24:15 от shm_alex »



  Записан

Kaster [?]

  • Глобальный модератор
  • Бритва, Бритва Оккама
  • *
  • *****
  • Репутация: 581
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 3751
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
[Математика] вычисление интегралов
« Ответ #8, Отправлен: Ноябрь 19, 2010, 08:32:07 »
shm_alex
1. твой код считает неверно
2. код приведенный мной считает верно, но в силу малой скорости сходимости, порог чувствительности нужно увеличить
3. в моем коде не используется значение функции в самой сингулярной точке (в нуле)


Добавлено: Ноябрь 19, 2010, 08:45:43
забыл сказать, замечания по оптимизации приняты. писал на скорую руку.
« Последнее редактирование: Ноябрь 20, 2010, 05:05:47 от Kaster, Причина: Объединение сообщений »



  Записан

shm_alex [?]

[Математика] вычисление интегралов
« Ответ #9, Отправлен: Ноябрь 19, 2010, 09:06:13 »
shm_alex
1. твой код считает неверно
Код не  мой , а твой,  я даже не примазываюсь. ) Мне он понравился .
Вот код отсчитал >
"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Program Files\AutoIt3\Examples\Shm\Debug\Integr.au3"   
>Exit code: 0    Time: 3441.260
я просто думал он завис и расходится
теперь что неправильно и какой код правильней
да для флоат арифметики дистрибутивный закон умножения относительно сложения не действует :
f(x_1)*h+f(x_2)*h+f(x_3)*h+...+f(x_n)*h <>h*(f(x_1)+....f(x_n))
так какая же из сумм будет ближе к искомому интегралу
надо думать , но мне кажется зависит от функции
....

Зы, на принтскрине имнтеграл (1/sqrt(x)) от нуля до 2 поэтому он отсчитал верно почти ... если б сумму выше считать начиная с маленьких членов см график ещё выше то результат былбы точнее . ..


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Ноябрь 19, 2010, 09:14:52 от shm_alex »



  Записан

Kaster [?]

  • Глобальный модератор
  • Бритва, Бритва Оккама
  • *
  • *****
  • Репутация: 581
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 3751
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
[Математика] вычисление интегралов
« Ответ #10, Отправлен: Ноябрь 19, 2010, 09:14:14 »
shm_alex
я ошибся. твой код считает норм. просто я проглядел что у тебя пределы другие.


Добавлено: Ноябрь 19, 2010, 09:16:11
shm_alex  [?]
Цитата
так какая же из сумм будет ближе к искомому интегралу
теория говорит, что вычисления с использованием средних прямоугольников точнее чем крайних при одном и том же кол-во итераций ;) и дело не в машинном отличии свойства дистрибутивности, а в выборе узлов интегрирования. я выбираю середину между двумя соседними, а ты правый




  Записан

shm_alex [?]

Re: [Математика] вычисление интегралов
« Ответ #11, Отправлен: Ноябрь 20, 2010, 00:08:18 »
Не согласен , если я тебя правильно понял имеется ввиду  следующее
Что площадь S_1 Точнее предсталяет площадь фигуры чем площадь S2 и S0 - я не согласен. существуют функции для которых это не так. Кстати, если приглядется прямоугольники выбраны такие как и у тебя просто умножение заменено суммой в цикле for.
Я говорил о другой ошибке , просто при сложении чисел ( http://www.softelectro.ru/ieee754.html ) с плавающей точкой  в машине происходит с начало выравнивание мантис  сложение и потеря младших битов.  В машинной арифметике с плавающей точкой как ни крути  мантиса имеет конечное число битов для
и тут ходит на первый план порядок суммирования  ведь для машины
10000000000000000000000000000000+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1=10000000000000000000000000000000
а
0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+10000000000000000000000000000000=
10000000000000000000000000000001
поэтому сначала надо просуммировать  маленькие числа а потом большие , для выбранной функции 1/sqrt(x) - имеет решающее значение , в близи нуля функция быстро растет и мы начинаем складывать сначала большие значения функции потом маленькие что и вносит основную ошибку


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Ноябрь 20, 2010, 00:37:34 от shm_alex »



  Записан

Kaster [?]

  • Глобальный модератор
  • Бритва, Бритва Оккама
  • *
  • *****
  • Репутация: 581
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 3751
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
Re: [Математика] вычисление интегралов
« Ответ #12, Отправлен: Ноябрь 20, 2010, 04:59:52 »
shm_alex  [?]
Цитата
Не согласен
твое право. можешь почитать тут - Численное интегрирование: Метод прямоугольников начиная с третего абзаца, там где "очевидно".
Цитата
существуют функции для которых это не так
однакож привел ты пример функции, для которой это так ;)
я понимаю, про ошибку о которой ты толкуешь, но подобного рода ошибки у меня ничтожно малы. а у тебя? ;) проверяется ведь легко, достаточно выводить на консоль каждую итерацию. операций со сверхбольшими и сверхмалыми числами у меня не возникало. потому что каждое большое число возникающее при при малых значениях из интервала умножается на маленькое число - длина интервала что делает это произведение пригодным для работы. у тебя же, складываются большие числа на одном конце интервала с малыми числами на другом, где собственно и копится ошибка.
Цитата
прямоугольники выбраны такие как и у тебя
опять мой прокол. просто я не люблю копаться в чужом коде  ;D




  Записан
 


Похожие темы
Тема Автор Ответов Просмотров Последний ответ
[Математика] Матрицы
AutoIt для новичков
SyDr 1 1940 Последний ответ Сентябрь 20, 2009, 07:54:57
от amel27
[Данные, строки] Вычисление относительного пути файла
AutoIt для новичков
lognik 5 1683 Последний ответ Май 08, 2010, 16:39:15
от lognik
[Математика] вычетание корня
AutoIt для новичков
andreitrane 4 1056 Последний ответ Апрель 17, 2011, 19:12:25
от Kaster
[Математика] сложение значений из файла
AutoIt для новичков
andreitrane 11 1369 Последний ответ Июнь 09, 2011, 11:37:17
от andreitrane
[Математика] Формула получения длины отрезка в оси координат
AutoIt для новичков
Nelsy 2 1418 Последний ответ Июль 23, 2011, 05:17:55
от Nelsy
[Математика] Генератор примеров сложение\вычитание
Примеры и рабочие проекты
Renz 8 3613 Последний ответ Сентябрь 18, 2011, 14:59:37
от Renz
[Математика] Разделение дроба на части
Регулярные выражения и прочее
MockeR 8 1498 Последний ответ Ноябрь 16, 2011, 05:31:24
от gregaz
Перенесено: [Математика] Разделение дроба на части
AutoIt для новичков
Kaster 0 568 Последний ответ Ноябрь 16, 2011, 00:50:55
от Kaster
Вычисление выражения, полученого со страницы в браузере
Стол заказов
-ZIG-ZAG- 18 2529 Последний ответ Декабрь 12, 2011, 09:01:51
от Kaster
[Математика] Вычисление корня кубического из отрицательного числа
AutoIt для новичков
snoitaleR 4 1468 Последний ответ Апрель 16, 2012, 16:01:57
от Kaster


Реклама

* Последние сообщения на форуме
post Re: [Элементы GUI] Объясните новичку, как при нажатии на кнопку происходило действие.
[AutoIt для новичков] Фазинур Сегодня в 19:51:14
post [Сеть, интернет] Инициализация интернет-подключения через RasDial (API rasapi32.dll)
[AutoIt для новичков] erlik Сегодня в 18:30:14
post Re: [Элементы GUI] Объясните новичку, как при нажатии на кнопку происходило действие.
[AutoIt для новичков] AZJIO Сегодня в 17:59:31
post Re: Если можно то как выполнять скрипт пошагово?
[AutoIt для новичков] Belfigor Сегодня в 16:19:22
post Re: Если можно то как выполнять скрипт пошагово?
[AutoIt для новичков] Фазинур Сегодня в 14:46:11
post [Элементы GUI] Объясните новичку, как при нажатии на кнопку происходило действие.
[AutoIt для новичков] Фазинур Сегодня в 14:38:03
post [Реестр] Редактирование имени принтера.
[AutoIt для новичков] Anatol_awesome Сегодня в 13:05:38
post Re: Еще один Dll Viewer
[Примеры и рабочие проекты] erlik Сегодня в 12:41:39
post Re: Прием файла по TCP
[Автоматизация IE и Web-интерфейса] andriy111 Сегодня в 12:13:43
post Re: Как отправить POST запрос через IE?
[Автоматизация IE и Web-интерфейса] andriy111 Сегодня в 08:28:39

* Пользователи онлайн
  • Dot Гостей: 103
  • Dot Скрыт: 1
  • Dot Пользователей: 22
  • Dot Пользователи Online: