Ru-Board.club
← Вернуться в раздел «Программы»

» Mathematica (математика)

Автор: BookWarrior
Дата сообщения: 23.05.2012 17:21
r_green

Цитата:
Т.е. по этому алгоритму решаются не все квинтики?
все, должно быть, но я там запутался в объяснениях по скриптам. Я лучше не буду комментировать об этом - я не знаю деталей. Во всяком случае если оно может с произвольными коэф-ми решить - чего же боле. Видимо запутался потому, что у них в одном из скриптов теми же преобразованиями, что и в решалке, выясняется симметричная группа, которой принадлежит полином, скрипт Galois.nb. Видимо это делается для того, чтобы понять, редуцируется ли квинтика вообще, для решения полиномов низших, чем 5-ый, порядков.

Кстати, сейчас в коде наткнулся: какая-то спец. функция там всё-таки есть - InverseEllipticNomeQ, и вы правы, похоже именно ею они и решают. Так что мои сказочно живописные спекуляции насчёт выбора группы симметрии выше отменяются (про поля по-моему всё-таки картина верна). Конкретно нормализованный исходный полином, т.е. приведённый к канонической форме (редуцированная квинтика)

t^5 - t + r = 0

(к это форме приводится любая исходная квинтика) решается эрмитовой решалкой HermiteQuinticSolve, которая как-то там нагромождает эти спец. ф-ции. А после из решения выбираются "правильные" корни.


Цитата:
общее решение квинтики принципиально не может быть алгебраическим, так ведь?
ммм... не знаю =( это уже далеко за пределами того, что я могу "на интуиции" даже вырулить. Боюсь для ответа мне надо понимать эти поля Галуа как минимум - т.е. я даже приблизительно не могу сказать, в какую сторону ветер дует.


Цитата:
Насколько же далеко отстоит типичный курс высшей математики даже на физмат факультетах от переднего края науки...
совсем неудивительно. Могу из своего опыта сказать (в нём наблюдается сходимость по данному вопросу, поэтому): всё, что преподают, т.е. до самого конца универа, - это вещи, которые очень оторваны от передового края любой науки. Это суть детсад учёных, где сами учёные - старшие школьники. Так потому, что обычно наука находится в отрыве по квалификации в минимум лет 5-8 от окончания универа, просто по факту. А эти 5-8 лет тратятся человеком на ковыряние всего вообще, до тех пор, пока не будет покрыта бездна между тем, что получил в "преподанном" прошлом и тем, что является минимальным квантом вклада в науку. Поэтому наблюдённая вами "бездна" совершенно закономерна и истребить её никак: преподать больше невозможно в универе, и инфа не станет новой, если не потратить 5-8 лет на штудирование.
Автор: Barabek
Дата сообщения: 30.05.2012 17:56
Народ, кто поможет разобраться?

Набросал код:

Manipulate[
Graphics[{{Blue, Opacity[0],
Polygon [{{-1, 0}, {-1, 1}, {1, 1}, {1, 0}}], Blue, Opacity[0.2],
Polygon [{{-1, 0}, {-1, -1}, {1, -1}, {1, 0}}]}, {Dashed, Blue,
Line[{{0, 1}, {0, -1}}]}, {Red, Line[{{0, 0}, pt}]}}], {{pt, {-1,
1}}, {-1, 0}, {1, 1}, Locator}]

который строит луч, падающий на плоскую поверхностью. Как теперь построить зеркально отражённый луч? В Demonstration Project много примеров на эту тему, но нет никаких пояснений как это делается.
Автор: BookWarrior
Дата сообщения: 31.05.2012 04:19
Barabek
полагаю, надо по закону Снелля теперь ещё одну линию посчитать (одной точки хватит), подставив в него координаты той, что уже отрисовывается. И будет вам вторая линия.

UPD: сори, что-то я про рефракцию подумал. У вас же просто отражение: тогда просто отрисуйте такую же линию через ноль, со второй точкой, у которой коорд. X2 = -X1 (от первой линии, верхней точки): Line[{{0, 0}, {-pt[[1]], pt[[2]]}}]

Код: Manipulate[
Graphics[{{Blue, Opacity[0],
Polygon[{{-1, 0}, {-1, 1}, {1, 1}, {1, 0}}], Blue, Opacity[0.2],
Polygon[{{-1, 0}, {-1, -1}, {1, -1}, {1, 0}}]}, {Dashed, Blue,
Line[{{0, 1}, {0, -1}}]}, {Red, Line[{{0, 0}, pt}]}, {Red,
Line[{{0, 0}, {-pt[[1]], pt[[2]]}}]}}], {{pt, {-1, 1}}, {-1,
0}, {1, 1}, Locator}]
Автор: Barabek
Дата сообщения: 31.05.2012 15:00
BookWarrior

Спасибо Вам большое!
Автор: Andrew10
Дата сообщения: 18.06.2012 10:11
Добрый день всем!

Возник очередной вопрос: как сделать так, чтобы интергирование и суммирование в аналитическом выражении поменялись местами?

Скажем, было
Integrate[Sum[expr, {n, 1, \[Infinity]}], {x, 0, 1}],
А нужно, чтобы прежде, чем выражение вычислялось, стало

Sum[Integrate[expr, {x, 0, 1}],{n, 1, \[Infinity]}]
Или поменять эти операции в обратную сторону?

Здесь expr - выражение, в общем случае довольно сложное, но зависящее от непрерывной переменной x и целой переменной n.

Спасибо!
Автор: popkov
Дата сообщения: 18.06.2012 11:44
Andrew10
Обе записи легитимны. С точки зрения производительности первый вариант имеет преимущество.


Цитата:
А нужно, чтобы прежде, чем выражение вычислялось, стало

Не понимаю, что конкретно имеется в виду. И для чего?
Автор: Andrew10
Дата сообщения: 18.06.2012 11:59
popkov


Цитата:
Не понимаю, что конкретно имеется в виду. И для чего?


Стоит задача решить численно интегральное уравнение методом Галеркина, при этом оно (уравнение) сводится к линейной системе алгебраических уравнений. Смена последовательности суммирования и интегрирования - составная часть этой процедуры в процессе вычисления элементов матрицы. При этом для элементов матрицы получаются аналитические выражения, что сильно сокращает время вычислений. Конечно, все это можно проделать и "руками", но хочется автоматизировать процесс, поскольку однотипные вычисления нужно будет проводить несколько раз для различных граничных условий в исходной краевой задаче.
Кроме того, хочется и научиться еще чему-нибудь полезному
Автор: popkov
Дата сообщения: 18.06.2012 15:51
Andrew10
Тогда, боюсь, я ничего не могу подсказать, не зная сам алгоритм решения задачи. Видимо, необходимо решать задачу по шагам, чередуя символьные и численные этапы, и в одну строчку записать это вряд ли получится.
Автор: Andrew10
Дата сообщения: 18.06.2012 16:51
popkov

Цитата:
Видимо, необходимо решать задачу по шагам, чередуя символьные и численные этапы, и в одну строчку записать это вряд ли получится.


В одну строчку и не требуется. Для "полуавтоматизации" выкладок мне достаточно понять, как сделать примерно следующее:

Есть выражение вида

Sum[ expr, {n,0,Infinity}]==0
где expr - выражение, представляющее собой произведение нескольких сомножителей, каждый из которых зависит от целой переменной n, а также может зависеть от непрерывной переменной x, а может и не зависеть. Интегрирую это уравнение по x от 0 до 1 и хочу представить все выражение в виде

Sum[ expr1 Integrate[expr2,{x,0,1}],{n,0,Infinity}],

где в expr1 сгруппированы те сомножители, которые не зависят от x, а в expr2 - те, которые зависят.

Сейчас делаю это "тупо" руками, переписывая формулы в окне Математики. Требует изрядного времени, но, главное, велик риск ошибок.

Мне нужно на Математике только получить аналитические выражения для коэффициентов системы линейных уравнений, а численные расчеты будут проводиться на Фортране.
Автор: r_green
Дата сообщения: 19.06.2012 09:19
Andrew10

Код:
Sum[expr[n, x], {n, 0, Infinity}] == 0 // MapAt[Integrate[#, {x, 0, 1}] &, #, {1, 1}] &
Автор: Andrew10
Дата сообщения: 19.06.2012 10:23
r_green

Спасибо, почти то, что нужно. Еще бы научиться выносить из под интеграла множители в expr, не зависящие от x!

Автор: r_green
Дата сообщения: 19.06.2012 11:03
Andrew10

Цитата:
Еще бы научиться выносить из под интеграла множители в expr, не зависящие от x

Это не улучшит эффективность интегрирования - Integrate[] сама умеет делать такое упрощение. AFAIK.
Автор: Andrew10
Дата сообщения: 19.06.2012 12:31
r_green

Цитата:
Это не улучшит эффективность интегрирования - Integrate[] сама умеет делать такое упрощение. AFAIK.

А мне и не нужно интегрировать. В конечном счете получаются интегралы от произведения полиномов Гегенбауэра на синусы и косинусы, для которых в Бычкове-Прудникове есть формулы, а Математика их не знает. Так что все равно приходится интегралы с помощью подстановки заменять на их аналитические выражения.
Я уже написал чуть выше, что собственно численные расчеты планируется проводить не на Математике, а на Фортране, Математика используется только для аналитических выкладок.

Автор: r_green
Дата сообщения: 19.06.2012 15:21
Andrew10
Сделайте тогда ф-цию, которая произведение expr разбивает на 2 по критерию зависимости от заданной переменной (например, с пом. Select[]) и применяет Intergate (или вашу собственную ф-цию интегрирования) к зависящей части.
Автор: Andrew10
Дата сообщения: 19.06.2012 18:06
r_green
Про Select[] понял, а есть ли в Математике функция, которая определяет, зависит ли expr от переменной x, или нужно такую функцию соорудить самому, например с помощью дифференцирования?
Автор: r_green
Дата сообщения: 19.06.2012 18:27
Andrew10
FreeQ[]
Автор: Andrew10
Дата сообщения: 19.06.2012 18:41
r_green

Цитата:
FreeQ[]


Понял, спасибо!!!

Автор: Andrew10
Дата сообщения: 27.08.2012 15:54
Привет всем!

Очередной вопрос знатокам Mathematicа-и:
Как в автоматическом режиме детектировать, что выполнение функции FindRoot завершилось с сообщением:

FindRoot::lstol: The line search decreased the step size to within tolerance specified by AccuracyGoal and PrecisionGoal but was unable to find a sufficient decrease in the merit function. You may need more than MachinePrecision digits of working precision to meet these tolerances
?

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

Спасибо!
Автор: popkov
Дата сообщения: 27.08.2012 16:33
Andrew10
Цитата:
В хелпе рекомендуется в этом случае запустить FindRoot еще раз, задав в качестве начального приближения результат поиска корня при вызове, закончившимся таким сообщением.
Любопытно. Ссылочку не подкинете (или цитату)?

Цитата:
Хочется делать это автоматически.
Это несложно:
Код: min = FindRoot[{Exp[x - 2] == y, y^2 == x}, {{x, 1}, {y, 1}}]
FindRoot[{Exp[x - 2] == y, y^2 == x}, Evaluate[min /. Rule -> List]]
Автор: Andrew10
Дата сообщения: 27.08.2012 21:08
popkov

Цитата:
Любопытно. Ссылочку не подкинете (или цитату)?

В help-e к функции FindRoot написано, в частности:

If FindRoot does not succeed in finding a solution to the accuracy you specify within MaxIterations steps, it returns the most recent approximation to a solution that it found. You can then apply FindRoot again, with this approximation as a starting point.

Кроме этого, личный опыт показывает, что это действительно так, если только отыскиваемый корень не является кратным.


Цитата:
Это несложно:
Код:
min = FindRoot[{Exp[x - 2] == y, y^2 == x}, {{x, 1}, {y, 1}}]
FindRoot[{Exp[x - 2] == y, y^2 == x}, Evaluate[min /. Rule -> List]]


К сожалению, это несколько не то, что требуется. Я хотел бы вторично вызывать FindRoot _только_ в том случае, если первый вызов закончился соответствующим сообщением FindRoot::lstol. Для этого нужно иметь средство автоматической диагностики нештатного завершения вызова.
Автор: popkov
Дата сообщения: 27.08.2012 21:32
Andrew10
Цитата:
Для этого нужно иметь средство автоматической диагностики нештатного завершения вызова.
Для этого есть функция Check[]. Однако должен заметить, что Вы неправильно понимаете смысл сообщения FindRoot::lstol. Надо читать то, что написано: проблема не в ограниченном MaxIterations, а в недостаточном WorkingPrecision. Повышение последнего выше MachinePrecision часто помогает решить проблему, если Вам действительно необходимо большое количество точных значащих цифр решения. Если же нет, - можно просто снизить PrecisionGoal, и сообщение больше появляться не будет.

Приведенная цитата из справки относится к другому сообщению: FindRoot::cvmit.

Если Вы решите пойти по пути увеличения WorkingPrecision, то учтите один ключевой и недостаточно ясно документированный момент: чтобы это сработало, необходимо, чтобы все действительные числа внутри Вашей функции (а также стартовые значения, если указаны) имели точность не ниже той, что указана в качестве значения опции WorkingPrecision.
Автор: Andrew10
Дата сообщения: 27.08.2012 21:50
popkov

Цитата:
Для этого есть функция Check[]. Однако должен заметить, что Вы неправильно понимаете смысл сообщения FindRoot::lstol. Надо читать то, что написано: проблема не в ограниченном MaxIterations, а в недостаточном WorkingPrecision. Повышение последнего выше MachinePrecision часто помогает решить проблему, если Вам действительно необходимо большое количество точных значащих цифр решения. Если же нет, - можно просто снизить PrecisionGoal, и сообщение больше появляться не будет.


За ссылку на Check спасибо, это, по-видимому, то, что надо.
Что касается WorkingPrecision, то повышать его в моем случае затруднительно, т.к. ищется корень функции, которая, в свою очередь, рассчитывается в результате алгоритма, включающего численное интегрирование, разложение матрицы и т.д. Перенастраивать все это на повышенную WorkingPrecision не хочется, да и не имеет смысла, т.к. значения корней нужны не с "бешеной точностью". Поэтому PrecisionGoal - это в точку, про этот параметр я забыл. Особо высокой точности мне не нужно, а нужно, чтобы поиск корня в цикле при изменении параметра системы проходил без подобных сообщений.

Огромное спасибо!
Автор: Andrew10
Дата сообщения: 12.09.2012 20:33
Привет всем!
Очередной вопрос для гуру

Нужно составить паттерн, который соответствовал бы строке, содержащей символьное представление положительного числа с точкой, т.е. таким строкам, как, например, "1234.5678", "12345678." или ".12345678", но не строке с одной единственной точкой "."! Предлагаемое решение:
Except[".",RegularExpression["\\d*\\.\\d*]].
Однако при попытке распознавания получаю следующее:
In[]:= StringMatchQ[ "1234.5678",Except[".",RegularExpression["\\d*\\.\\d*]]]
Out[]:= True

In[]:= StringMatchQ[ "12345678.",Except[".",RegularExpression["\\d*\\.\\d*]]]
Out[]"= True

In[]:= StringMatchQ[ ".12345678",Except[".",RegularExpression["\\d*\\.\\d*]]]
Out[]:= False

То есть в последнем случае паттерн не работает. Не могу понять почему?

Спасибо!
Автор: popkov
Дата сообщения: 13.09.2012 07:31
Andrew10
Похоже, баг. Проще обойтись без Except:
Код: StringMatchQ[".12345678",
RegularExpression["(\\d+\\.\\d*)|(\\d*\\.\\d+)"]]
Автор: Andrew10
Дата сообщения: 13.09.2012 09:04
popkov

Цитата:
Похоже, баг. Проще обойтись без Except:


Понял, а то я уж совсем отчаялся понять такое поведение.
Вашим вариантом воспользуюсь, спасибо!


Цитата:
Однако гораздо проще и правильнее в данном случае использовать NumberString:
Код:
StringMatchQ[".12345678", NumberString]


Про NumberString я знаю, но дело в том, что этот кусочек есть составная часть кода для импорта чисел в формате Фортрана ( типа 1.2345e-005) в формат Real Mathematic-и, хотелось обойтись одним регулярным выражением для всего преобразования. Я искал в хелпе, нет ли такой функции в самой системе, но что-то не нашел.


Автор: popkov
Дата сообщения: 13.09.2012 12:36
Andrew10
Цитата:
для импорта чисел в формате Фортрана ( типа 1.2345e-005)
Вообще-то Import умеет это делать и сам. Например:
Код: ImportString["1.2345e-005", "Table"]
(* => {{0.000012345}} *)
Автор: r_green
Дата сообщения: 13.09.2012 14:48
<удалено как неактуальное>
Автор: Andrew10
Дата сообщения: 13.09.2012 15:20
popkov
Спасибо за советы
Как говорится, век живи, век учись
Автор: popkov
Дата сообщения: 13.09.2012 22:38
Andrew10
Простой тест, какие форматы импорта поддерживают импорт чисел в данном формате:
Код: test = {#, Quiet[ImportString["1.2345e-005", #]]} & /@ $ImportFormats;
Select[test, Count[#, (_Real | _Integer), {1, Infinity}] == 1 &] // Grid
Автор: r_green
Дата сообщения: 13.09.2012 23:16
popkov
Формат без избыточности (это практически все числовые форматы) позволяет интерпретацию в этом формате любых исходных данных.

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: Идея несуществующей программы...


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.