LINUX.ORG.RU

Вычисление гиперболических функций на С.

 , ,


1

5

В общем, у меня граничные условия задаются гиперболическими функциями (tanh + tanh). По факту это потенциальная яма, которая может принимать любую форму. Выбор функций в целом был произволен, мне просто нужен был потенциальный колодец с локализованными силами. Я сейчас решил причесать свой код и оказалось, что простая смена операций при вычислениях даёт большую разницу. Я не могу сказать, что меня это сильно волнует: у меня качественная модель с ODE первого порядка. Но мне хотелось бы на будущее знать, как работать с подобными функциями, чья область значений меняется в очень больших пределах.

★★★★★

Последнее исправление: ZERG (всего исправлений: 1)

Выбери более гладкие функции, раз выбор произволен. Яму можно смоделировать без тахакиусов и его друзей.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

Например? Мне нужно что-то, что даст быстро убывающую производную, но кроме экспоненциальных функций ничего не приходит в голову.

ZERG ★★★★★
() автор топика

у меня качественная модель с ODE первого порядка.

как работать с подобными функциями, чья область значений меняется в очень больших пределах.

Неявная схема для решения ОДУ должна помогать в таких случаях. Несколько итераций, и решение сходится. Если не сходится, уменьшаешь шаг.

i-rinat ★★★★★
()
Ответ на: комментарий от FilosofeM

Попробуй функции гетероскедастичных временных рядов в вакуумном пространстве

Работает только в частном случае equus sphaerica.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Так дело же не в схеме, мне всё равно, насколько она хороша. Дело-то в том, что у меня входные параметры для граничных условий сильно прыгают, от этого результат скачет. В целом мне всё равно, какой результат, просто не устраивает такая нестабильность. Не хочется в один прекрасный момент получить NaN или Inf.

ZERG ★★★★★
() автор топика
Ответ на: комментарий от ZERG

у меня выбора нет

Это как вообще? Какой-то готовый софт использует явные схемы? Это жесть.

но дело же тут не в схеме

Тут два варианта. Либо ты всё понимаешь, ты прав, но не договариваешь каких-то важных деталей. Либо ты всё «понимаешь», даже не прочитав начало какого-нибудь учебника по численным методам.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)

что простая смена операций при вычислениях даёт большую разницу

Что такое смена операций при вычислениях? Ты имеешь в виду смену порядка вычислений, навроде перемены порядка множителей? Просто я с таким сталкивался как раз.

Crocodoom ★★★★★
()
Ответ на: комментарий от i-rinat

Только не говори, что ты явные схемы используешь.

Эх, если бы везде можно было использовать неявные схемы, жизнь бы заиграла воистину новыми красками

Crocodoom ★★★★★
()
Ответ на: комментарий от i-rinat

Это как вообще? Какой-то готовый софт использует явные схемы? Это жесть.

Это не готовый софт (хотя я был бы рад). Всё было написано грубыми мужскими руками.

Тут два варианта. Либо ты всё понимаешь, ты прав, но не договариваешь каких-то важных деталей. Либо ты всё «понимаешь», даже не прочитав начало какого-нибудь учебника по численным методам.

find a man who can do both

с ode я уже со времён универа не работал, это правда. Но тут проблема следующего характера: нужны граничные условия, весьма локализованные. Всё равно, как они выглядят, результат только качественный. Однако при вычислении расстояния до границы аргумент может быть большим + он скейлится, в результате получаются выражения вроде cosh(100) или 1/cosh(100), которые не упрощаются. Результат вполне себе конечный и в разумных пределах, но промежуточные значения просто чудовищные (либо малые). Вот и вопрос: как работать с величинами, различающимися на порядки, чтобы конечный ответ не сильно отличался от реальности.

ZERG ★★★★★
() автор топика
Ответ на: комментарий от ZERG

Попробуй для начала перегруппировать множители, то есть перейди условно говоря от (a*b*c)/(d*e*f) к (a/d)*(b/e)*(c/f). Следи, чтобы ни на одной стадии вычисления выражения промежуточные результаты не вылетали из допустимого диапазона float (или double). Часто мне этого удавалось добиться как раз такой перегруппировкой.

На изменение результата от казалось бы тождественного преобразования могут ещё влиять оптимизации. Например с -Ofast я на это постоянно напарывался, а с -O3 такого нет. Хотя у той же CUDA и на -O3 такие фокусы могут быть.

Crocodoom ★★★★★
()
Ответ на: комментарий от ZERG

Однако при вычислении расстояния до границы аргумент может быть большим + он скейлится, в результате получаются выражения вроде cosh(100) или 1/cosh(100), которые не упрощаются. Результат вполне себе конечный и в разумных пределах, но промежуточные значения просто чудовищные (либо малые)

Нужно посмотреть на точную формулу, что-нибудь придумаем. В конце концов можно cosh и по определению выписать, если потребуется.

Crocodoom ★★★★★
()
Ответ на: комментарий от ZERG

А у Вас там рили принято на английском или просто знания русского слабые? Просто в РФ я ode не встречал ни в одной книжке и не слышал ни от одного препода. Если бы не читал одну книжку по численным методам на английском на втором курсе, то даже не знал бы что это такое.

По теме — tanh+tanh это сумма двух гиперболических тангенсов? Кстати, в РФ тоже не все сразу поймут что это, тут принято th писать.

А теперь по теме — у вас 3 варианта:

  • Если значения действительно очень сильно большие или маленькие на выходе и так и должно быть, то числа с длинной арифметикой, может даже не просто long а специальные библиотеки которые работают с числами очень большой разрядности
  • Если это ошибка метода (отсутствие сходимости) приводит к таким результатам то менять метод расчета повышением порядка точности
  • Если можно упростить исходное уравнение или заменить его более простым, то лучше так и сделать
peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от Crocodoom

Ну вот первый потенциал

tanh(A * sqrt(x^2 + y^2) - B) + tanh(-A * sqrt(x^2 + y^2) - B)

И второй:

tanh(A * x - B) + tanh(-A * x - B)

где A = 20 и B~100-200 (опытным путём подбирал).

Со вторым проще: там только одна ненулевая производная. У первого вылазит x/sqrt(x^2 + y^2) и y/sqrt(x^2 + y^2) как сомножители, уже группировка их отдельно меняет результат после определённого количества итераций.

ZERG ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Видел подобный сдвиг терминологии у тех, кто матлабом пользовался. Там в названиях функций — ode и tanh.

i-rinat ★★★★★
()
Ответ на: комментарий от ZERG

Ничего не понятно из твоих объяснений.

Если не хватает точности double, заюзай более точные представления.

i-rinat ★★★★★
()
Ответ на: комментарий от peregrine

А у Вас там рили принято на английском или просто знания русского слабые?

И кому же мне в Великобритании рассказывать про ОДУ?

Просто в РФ я ode не встречал ни в одной книжке и не слышал ни от одного препода.

Ну так моей вины в этом нет. Те люди, с которыми я учился, без проблем понимают и ODE, и ОДУ. Полагаю, что нужно больше читать профильной литературы.

Если бы не читал одну книжку по численным методам на английском на втором курсе, то даже не знал бы что это такое.

Я книги по диффурам на русском в последний раз читал лет 8 назад, кроме вержбицкого и не назову никого.

Если можно упростить исходное уравнение или заменить его более простым, то лучше так и сделать

Внимание, вопрос: как это сделать?

ZERG ★★★★★
() автор топика
Ответ на: комментарий от ZERG

Внимание, вопрос: как это сделать?

Зависит от задачи и конкретного уравнения.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

А почему я должен обновлять место жительства по требованию? Это же не военный комиссариат.

P.S. Задачу я привёл выше.

ZERG ★★★★★
() автор топика

Прочитал ОП, тред, но так и не понял, в чем твоя проблема. Что такое смена операций? Разница в чем? Решение неустойчиво к семантически тождественному изменению вида исходных функций или что?

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

Решение неустойчиво к семантически тождественному изменению вида исходных функций или что?

Не решение, а результат вычисления, но суть ты уловил верно.

ZERG ★★★★★
() автор топика
Ответ на: комментарий от buddhist

Yep. Я слышал о подобных проблемах, но никогда на практике не сталкивался, к своему стыду и сожалению.

ZERG ★★★★★
() автор топика

В общем, единственный вариант, который выглядит удовлетворительно, это ручками делать, отдельно рассматривать диапазоны координат и значений. Или скейлить (что тоже люди в MD делают), но это боль в заднице.

Я думал, что GSL в этом плане хорош, некоторые базовые функции у них самописные, но у них просто дополнительные проверки выполняются ( и есть возможность выводить код ошибки), но внутри тот же exp, только в три раза медленнее (!) даже с -О3.

ZERG ★★★★★
() автор топика
Ответ на: комментарий от buddhist

А то!

Вот классический пример:

1000-sqrt(1000^2-1) = 5.00000125043698e-04
1/(1000+sqrt(1000^2-1)) = 5.00000125000063e-04

первый ответ неверен, начиная с ...4369. Если что, это меньший из корней квадратного уравнения x² - 2000x + 1 =0.

unanimous ★★★★★
()
Ответ на: комментарий от ZERG

Ну, в этом конкретном случае (корни квадратного уравнения) есть, если мне не изменяет память, 6 различных случаев, для которых существуют «правильные» формулы, позволяющие вычислять корни без потери точности, ну примерно как тут: вместо корня b/2a - sqrt(b²/4 - ac)/a вычисляется c/(b/2 + sqrt(b²/4 - ac)), что дает ответ без потери точности при b²/4 >> ac.

А в целом, нужно применять «правильные» алгоритмы или их варианты с учетом конечной разрядности чисел с плавающей точкой на компе. Или, если оных нет, использовать арифметику без округлений или с вариабельным округлением, вроде работы с рациональными приближениями или числами произвольной точности. Последнее существует во многих инкарнациях, например в виде библиотеки GNU MP.

Только пойми правильно: я не аргументирую в пользу MP, это такая тяжелая артиллерия на случай, когда ничего не сработало.

unanimous ★★★★★
()
Ответ на: комментарий от unanimous

нда, печально, радует только то, что мне не нужна такая точность.

ZERG ★★★★★
() автор топика
Ответ на: комментарий от buddhist

Я посмотрел пару статей и зарыдал. Хотя я знал и раньше, что та же математика хромает, когда дело касается реальных вычислений. Там же куча багов, некоторые по несколько мажорных релизов висят.

ZERG ★★★★★
() автор топика

Весь тред не читал. При чем тут гиперболический тангенс к гипергеометрической функции?

aquadon ★★★★★
()
Ответ на: комментарий от aquadon

Сплю плохо, стресса много, вот и заменяю слова похожими.

ZERG ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.