Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Wolfram Mathematica | Математика

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Открыть новую тему     Написать ответ в эту тему

xy



ХУдератор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Wolfram Mathematica 14

Загрузка и поиск "лекарств"в "Варезнике"


 
Здесь обсуждаем вопросы языка Mathematica и программы, которая ИМХО лучше других выполняет свою задачу и, кроме, того очень точно соответствует своему названию, хотя там не забыли и про физиков и химиков и всех остальных:)

Всего записей: 10530 | Зарегистр. 28-05-2003 | Отправлено: 16:00 01-12-2003 | Исправлено: zAlAn711, 18:21 10-01-2024
r_green



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TomasVercetti
Для запаса.  
Чтобы компенсировать возможную потерю точности при вычислении precision - ф-ция Precision[] возвращает результат с машинной точностью (MachinePrecision).
При желании можно рассчитать добавку более точно. Но, с другой стороны, это сделает ф-цию сравнения более медленной.
 
Добавлено:
Вот так, наверно, будет минимально необходимая добавка:

Код:
MyEqual[a_, b_] := SetPrecision[a, SetPrecision[Precision[a], Infinity] + Log10[2^8 - 1]] == SetPrecision[b, SetPrecision[Precision[b], Infinity] + Log10[2^8 - 1]]

Всего записей: 145 | Зарегистр. 17-09-2004 | Отправлено: 13:29 11-01-2011
Alex_B



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov
Простите за долгое отсутствие. Это не потому, что вопрос для меня неинтересен.

Цитата:
"principal root" (термин, отчетливого определения которого я так и не нашел

Возможно, я что-то не понял, но мне кажется, что тут просто недоразумение. "principal root" - это не понятие, введенное в Mathematica, а чисто математическое понятие. Мы же не требуем от Mathematica, чтобы они дали определение синуса.

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

Конечно, они это не предполагали. Они предполагали другое, а именно, что функции используемые в Mathematica, где это возможно, определены в пространстве комплексных чисел.

Всего записей: 1088 | Зарегистр. 10-01-2002 | Отправлено: 13:35 15-01-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alex_B

Цитата:
"principal root" - это не понятие, введенное в Mathematica, а чисто математическое понятие.
Это я понимаю, просто найти его четкое определение мне не удалось. Кроме того, везде подчеркивается неоднозначность определения этого термина в некоторых случаях.  

Цитата:
Они предполагали другое, а именно, что функции используемые в Mathematica, где это возможно, определены в пространстве комплексных чисел.
Я это писал к тому, что в Mathematica фактически отсутствует спецификация ко всем встроенным функциям. "Предполагать", что пользователь догадается, - не спецификация! К тому же они дали хоть какое-то объяснение для комплексных чисел, а про отрицательные забыли. И впоследствии не стали шасширять объяснение, так и оставив его недоделанным. Хотя недопонимание пользователями работы функции Power имеет многолетнюю историю.
 
r_green

Цитата:
Вот так, наверно, будет минимально необходимая добавка:
MyEqual[a_, b_] := SetPrecision[a, SetPrecision[Precision[a], Infinity] + Log10[2^8 - 1]] == SetPrecision[b, SetPrecision[Precision[b], Infinity] + Log10[2^8 - 1]]  
Недавно был предложен простой вариант беспроблемного Clip между -1 и 1. Вот сопоставление работы его и стандартного Clip[#,{-1,1}]&:
 
list = {"1.00000000000000036", "1.000000000000000360000",  
   "0.9999999999999966", "0.9999999999999966000"};
Clip1[x_] := Sign[x]*Min[Abs[x], 1];
TableForm[
 InputForm /@ {#, v = ToExpression[#], Clip[v, {-1, 1}], Clip1[v]} & /@
   list, TableHeadings -> {None, {"Input", "InputForm", "Clip",  
    "Clip1"}}]

 
Input InputForm Clip Clip1    
"1.00000000000000036" 1.00000000000000036`17. 1.00000000000000036`17. 1    
"1.000000000000000360000" 1.00000000000000036`21.     1 1    
"0.9999999999999966" 0.9999999999999966 0.9999999999999966 0.9999999999999966    
"0.9999999999999966000" 0.9999999999999966`19. 0.9999999999999966`19. 0.9999999999999966`19.

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 08:16 17-01-2011 | Исправлено: popkov, 13:00 17-01-2011
r_green



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov

Цитата:
Недавно был предложен простой вариант беспроблемного Clip между 0 и 1.

По-моему, этот вариант не очень хорошо масштабируется на произвольный интервал.
 
Вот беcпроблемный(вроде бы) вариант, полностью повторяющий интерфейс стандартного Clip:

Код:
Clip2[args__] := Module[{p = SetPrecision[Precision[{args}], Infinity]}, SetPrecision[Clip @@ SetPrecision[{args}, p + Log10[2^8 - 1]], p]]


Всего записей: 145 | Зарегистр. 17-09-2004 | Отправлено: 13:56 17-01-2011 | Исправлено: r_green, 14:09 17-01-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
r_green

Цитата:
Вот беcпроблемный(вроде бы) вариант, полностью повторяющий интерфейс стандартного Clip:
Clip2[args__] := Module[{p = SetPrecision[Precision[{args}], Infinity]}, SetPrecision[Clip @@ SetPrecision[{args}, p + Log10[2^8 - 1]], p]]  

Этот вариант не совсем корректно работает в ситуациях, когда границы являются целыми числами:
 
In[6]:= Clip2[1.00000000000000036] // InputForm
 
Out[6]//InputForm=
1.`17.
 
Хотя должно быть просто 1:
 
In[7]:= Clip1[1.00000000000000036] // InputForm
 
Out[7]//InputForm=
1
 
Добавлено:
Кстати, недавно сформулированный глюк функции Sort[list,p]:
 
Если ordering function p не возвращает ни True, ни False или остается невыполненной, она рассматривается как вернувшая True. В результате Sort возвращает первоначальный список, вместо того чтобы остаться невыполненным:
 
In[1]:= Sort[{a, c, d}, True &]
Sort[{a, c, d}, UndefinedFunction &]
Sort[{a, c, d}, Greater]

Out[1]= {a, c, d}
 
Out[2]= {a, c, d}
 
Out[3]= {a, c, d}

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 04:30 18-01-2011 | Исправлено: popkov, 05:03 18-01-2011
Alex_B



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov

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

Прежде всего это определение нужно искать в учебниках. Например, в книге "Лекции по теории функций комплексного переменного" Сидорова, Федорюка, Шабунина в параграфе 24 определяется понятие регулярной ветви аналитической функции. Principal root - это и есть одна из регулярных ветвей аналитической функции. Поскольку все регулярные ветви элементарных аналитических функций (тригонометрических, гипергеометрических, показательных и обратных к ним) определяются выбором функции Arg, то фактически выбор сводится к выбору из двух возможностей: 1) либо разрез проходит по положительной оси и тогда угол меняется от нуля до двух пи; 2) либо разрез проходит по отрицательной оси и угол меняется от минус пи до плюс пи. В Matematica принята вторая возможность.

Цитата:
в Mathematica фактически отсутствует спецификация ко всем встроенным функциям

Информация о том, что все элементарные функции понимаются как комплексные, что переменная x без дополнительных ограничений понимается как комплексная переменная, что разрез для функции Arg проходит по отрицательной оси мне попадалась в справке помощи.

Всего записей: 1088 | Зарегистр. 10-01-2002 | Отправлено: 08:16 18-01-2011 | Исправлено: Alex_B, 08:19 18-01-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alex_B

Цитата:
Информация о том, что все элементарные функции понимаются как комплексные, что переменная x без дополнительных ограничений понимается как комплексная переменная, что разрез для функции Arg проходит по отрицательной оси мне попадалась в справке помощи.  

В таком случае в грамотно продуманной документации на странице справки к Power вообще не должно быть информации о том, как она определена для комплексных аргументов - должна быть лишь ссылка на соответствующий раздел документации! А сейчас есть очень краткое и явно недостаточное объяснение для комплексных аргументов, а для отрицательных пользователь должен "догадаться" или же искать неизвестно где в документации (кстати, ткните, пожалуйста, где об этом сказано?).

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 08:36 18-01-2011 | Исправлено: popkov, 08:43 18-01-2011
r_green



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov

Цитата:
Этот вариант не совсем корректно работает в ситуациях, когда границы являются целыми числами:  

Да, Вы правы.  
Тогда вот так, пожалуй:

Код:
Clip2[x_, {min_, max_}] := Min[Max[x, min], max]

 
Кстати, примечательна непоследовательность Mathematica в правилах работы ф-ций Less/Greater и Min/Max - первые отбрасывают последние 7 бинарных цифр приближенного числа, вторые - нет.
 
Причём в документации к Less/Greater это не упоминается...

Всего записей: 145 | Зарегистр. 17-09-2004 | Отправлено: 15:27 18-01-2011 | Исправлено: r_green, 15:34 18-01-2011
Alex_B



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov

Цитата:
кстати, ткните, пожалуйста, где об этом сказано?

У меня сохранилось несколько цитат со времени, когда и изучал документацию Mathematica 6.
 
By default, Mathematica assumes that any variable or symbol that does not have an explicit value can take any complex value.
 
With careful attention to branch cuts, Mathematica supports trigonometric functions everywhere in the complex plane, with extensive exact and algebraic transformations, together with efficient arbitrary-precision numerical evaluation. Mathematica follows the standard mathematical convention of using radians for trigonometric function arguments.
 
Unique "principal" values nevertheless have to be chosen for the functions. The choices cannot be made continuous over the whole complex plane. Instead, lines of discontinuity, or branch cuts, must occur. The positions of these branch cuts are often quite arbitrary. Mathematica makes the most standard mathematical choices for them.

Всего записей: 1088 | Зарегистр. 10-01-2002 | Отправлено: 15:38 18-01-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alex_B

Цитата:
The positions of these branch cuts are often quite arbitrary. Mathematica makes the most standard mathematical choices for them.
Да уж... На спецификацию это явно не тянет...
 
Добавлено:
r_green

Цитата:
Тогда вот так, пожалуй:
Clip2[x_, {min_, max_}] := Min[Max[x, min], max]
Превосходно! Можно добавить случай единственного аргумента и атрибуты, чтобы синтаксис совпадал со встроенным Clip:
Clip1[x_] := Min[Max[x, -1], 1]
Clip1[x_, {min_, max_}] := Min[Max[x, min], max]
SetAttributes[Clip1, {Listable, NumericFunction}]

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 17:50 18-01-2011 | Исправлено: popkov, 08:32 19-01-2011
vikkiv



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
помогите пожалуйста преобразовать вектор:
{a>=x,b<y,c==z}
 
в набор условий вида:
a>=x&&b<y&&c==z
 
Вроде просто оператором And[] сделать но скобки "{" и "}" все услилия убивают на нет..
(пример упрощённый .. на самом деле количество элементов довольно большое)
 
никак не могу найти самую простую реализацию .. какие могут быть альтернативы ?
заранее спасибо..

Всего записей: 747 | Зарегистр. 10-11-2005 | Отправлено: 21:00 19-01-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vikkiv
And @@ {a >= x, b < y, c == z}

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 21:29 19-01-2011
vikkiv



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov
 
не каждому дано знать их интерфейс до такого root-командного уровня синтаксиса..
 
Огрумущее Спасибо !!!
Надо-же как просто, уже второй день голову ломал, в их помощи-документации как сформировать такой запрос так и непридумал ..
 
только по модели @@ получилось .. Действительно функция Apply[And,cond]  (если cond={a>=x,b<y,c==z}) выполняет задачу просто превосходно..

Всего записей: 747 | Зарегистр. 10-11-2005 | Отправлено: 21:43 19-01-2011 | Исправлено: vikkiv, 21:47 19-01-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
2All
Блин, что они сделали с Mathematica при переходе от версии 5.2 к 7.01?  
Один и тот же код в:
 
1) Mathematica 5.2:
In[2]:=
$MinPrecision=$MaxPrecision=32;
1-0.00000000000000000000000000000001`32//RealDigits
 
Out[3]=
{{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},1}
 
In[1]:=
Block[{$MinPrecision=32,$MaxPrecision=32},
        1-0.0000000000000000000000000000001`32]//RealDigits
 
Out[1]=
{{9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},0}
 
 
2) Mathematica 7.01:
In[1]:= $MinPrecision = $MaxPrecision = 32;
1 - 0.00000000000000000000000000000001`32 // RealDigits
 
Out[2]= {{9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,  
  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, 0}
 
In[3]:= Block[{$MinPrecision = 32, $MaxPrecision = 32},  
  1 - 0.0000000000000000000000000000001`32] // RealDigits
 
Out[3]= {{9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,  
  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0}, 0}
 
Разница бросается в глаза. Так в чем же изменение, причина?

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 15:47 20-01-2011 | Исправлено: popkov, 21:32 20-01-2011
r_green



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov

Цитата:
что они сделали с Mathematica при переходе от версии 5.2 к 7.01?  

Насколько я понимаю - исправили баг.
В Вашем примере RealDigits для числа с точностью 32 выдаёт 31 цифру  в 5-й Математике, и 32 цифры (как и положено) - в 7-й.
 
А вообще, на мой взгляд, такие краевые случаи нужно исследовать, рассматривая нативное двоичное (а не десятичное) представление числа.

Всего записей: 145 | Зарегистр. 17-09-2004 | Отправлено: 01:00 21-01-2011 | Исправлено: r_green, 01:09 21-01-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Полезное: комбинация Ctrl+Q для завершения работы MathKernel

 
Чтобы завершать работу MathKernel по комбинации Ctrl+Q (окно ноутбука должно быть активным), нужно добавить 1 строку в файл "KeyEventTranslations.tr".
 
Инструкция:
Открываете директорию
C:\Program Files\Wolfram Research\Mathematica
и ищите в ней этот файл с помощью "Поиска" Explorer'a. Найдется по одному файлу на каждую версию Mathematica.
Далее открываете нужный файл, и в нем сразу после строки

Код:
EventTranslations[{

добавляете строку (не забудьте запятую в конце строки!):

Код:
Item[KeyEvent["q", Modifiers -> {Control}],FrontEndExecute[FrontEndToken[SelectedNotebook[],"EvaluatorQuit",Automatic]]],

Теперь сохраняете изменения и перезапускаете соответствующую версию Mathematica. Все!
 
Проверил: работает в Mathematica 7.0.1 и 5.2 без проблем.

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 18:08 06-02-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Интересно:
 
In[1]:=
0 * "some string"
 
Out[1]=
0
 
Зачем это?! Почему бы не оставлять подобные выражения невыполненными?
 
Насколько я понимаю, во многих встроенных функциях есть проверка типа входного выражения, но она часто половинчатая и дырявая, как решето. В случае фундаментальных функций типа Times такой проверки вообще не делается?
 
In[2]:=
0*a

 
Out[2]=
0
 
Все же, как ни крути, а подход разработчиков мне кажется странным. Если a=Infinity, то ответ будет другим:
In[3]:= a = Infinity;
0*a

 
During evaluation of In[2]:= \[Infinity]::indet: Indeterminate expression 0 \[Infinity] encountered. >>
 
Out[4]= Indeterminate

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 14:45 07-02-2011 | Исправлено: popkov, 16:01 07-02-2011
r_green



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov

Цитата:
Зачем это?! Почему бы не оставлять подобные выражения невыполненными?  

Если исходить из математического определения Times[] как мультипликативной операции кольца, то естественно априори считать её аргументы элементами кольца. Из чего следует тождество 0 * a = 0.
 
Можно, конечно, абстрагироваться от математического смысла операции и считать Times не умножением, а более общей ф-цией. Но что это даст?
 
Так что, на мой взгляд, разработчики поступили обоснованно.

Всего записей: 145 | Зарегистр. 17-09-2004 | Отправлено: 18:52 07-02-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
r_green

Цитата:
Если исходить из математического определения Times[]

В том-то и дело, что логика у нормального продукта должна быть единой, сквозной, а не набором "логик", каждая из которых применяется то там, то здесь. Через такую фрагментарную логику "обосновать" можно, что угодно. Это и есть главный принцип софистики: постоянная двусмысленность. Для любой "особенности" задним числом легко находится "обоснование", но предвидеть ее наличие именно в таком виде заранее невозможно.


Похоже, что  проверка типа входных параметров для многих функций вообще не выполняется или же выполняется очень половинчато. Кроме того, Infinity, Indeterminate и Overflow[] очень криво и половинчато интегрированы в систему. Например, потеря знака при возникновении Overflow[]:
 
In[1]:= 10^80000 < Exp[1.5*^-323228465]
 
During evaluation of In[1]:= General::ovfl: Overflow occurred in computation. >>
 
Out[1]= True

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 01:49 09-02-2011 | Исправлено: popkov, 02:49 09-02-2011
r_green



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov

Цитата:
В том-то и дело, что логика у нормального продукта должна быть единой, сквозной, а не набором "логик", каждая из которых применяется то там, то здесь. Через такую фрагментарную логику "обосновать" можно, что угодно.

Согласен, но не совсем понимаю, каким образом это касается обсуждаемого вопроса.
Всё, что я предложил - это рассматривать Times[] как модель математической операции умножения. Вряд ли это можно назвать отступлением от общей логики математического пакета вообще, а не только Mathematica...

Всего записей: 145 | Зарегистр. 17-09-2004 | Отправлено: 20:13 12-02-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Компьютерный форум Ru.Board » Компьютеры » Программы » Wolfram Mathematica | Математика


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru