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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vikkiv

Цитата:
С более длинными массивами (3-4 дня 10000>n>15000, интервалы=15 мин) как и ожидалось алгоритм оказался весьма требовательным к ресурсам

Это было скорее концептуальное решение, без претензии на какую-либо оптимальность.
Наиболее очевидные пути оптимизации (в предположении, что размер массива events намного больше массива целевых интервалов времени):
- работать прямо с исходным представлением events, без создания промежуточного массива.
- итерацию по целевым интервалам делать во внутреннем цикле, а по массиву events - соответственно во внешнем (т.е. противополжно текущему решению).
- скомпилировать код внутреннего цикла (т.е. ф-цию, накопляющую данные по интервалам).

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

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
lesnikforum, TomasVercetti
На оффсайте только что выложили материалы сегодняшнего (по их времени) семинара "Advanced GPU Programming Using Mathematica and CUDA":
http://library.wolfram.com/infocenter/Conferences/7806/

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 02:47 04-05-2011
qwer1304

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста как продифиренциировать функцию относительно ее аргумента.
 
Например:
sin'(x)=cos(x)
sin'(2x+3-x^2+ln(sin(x)))=cos'(2x+3-x^2+ln(sin(x)))
 
Математика отказывается это делать ругаясь на то, что дифиренциация относительно не переменной.
 
Спасибо,
Д

Всего записей: 353 | Зарегистр. 26-04-2003 | Отправлено: 10:55 09-05-2011
yuk1958



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qwer1304
 
Может быть так попробовать?
 


Всего записей: 1471 | Зарегистр. 12-08-2010 | Отправлено: 11:42 09-05-2011
qwer1304

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет, это стндартная дифференциация, т.е:
df/dx(f(y)=df/dy*dy/dx, а мне надо только df/dy.

Всего записей: 353 | Зарегистр. 26-04-2003 | Отправлено: 19:58 09-05-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
qwer1304
Можно так:
 
In[1]:= ToExpression["sin(2x+3-x^2+log(sin(x)))", TraditionalForm]
 
Out[1]= Sin[3 + 2 x - x^2 + Log[Sin[x]]]
 
In[2]:= % /. f_[arg_] :> f'[arg]
 
Out[2]= Cos[3 + 2 x - x^2 + Log[Sin[x]]]
 
Данный метод основан на том обстотельстве, что функция ReplaceAll выполняет замену, начиная с самого верхнего уровня (Level 0) вниз, к более глубоким уровням исходного выражения. Поэтому, выполнив замену на f'[arg], она уже не анализирует arg, оставляя аргумент неизменным.

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 21:11 09-05-2011 | Исправлено: popkov, 07:05 10-05-2011
qwer1304

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

Всего записей: 353 | Зарегистр. 26-04-2003 | Отправлено: 22:19 10-05-2011
r_green



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

Цитата:
Подскажите пожалуйста как продифиренциировать функцию относительно ее аргумента.  


Код:
In[1]:= d[f_[x_]] = f'[x];

 
Пример использования:

Код:
In[2]:= d@Sin[2 x + 3 - x^2 + Log[Sin[x]]]
Out[2]= Cos[3 + 2 x - x^2 + Log[Sin[x]]]

 
Это вариант решения, предложенного popkov.
 

Всего записей: 145 | Зарегистр. 17-09-2004 | Отправлено: 11:16 11-05-2011 | Исправлено: r_green, 12:30 11-05-2011
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем!
 
Некоторое время назад задавал  
вопрос
о решении численно дифференциальных уравнений с предварительной подстановкой параметров. Получил рецепт
от popkov, который приводится ниже для случая гармонического осциллятора:
 

Цитата:
Andrew10
Вот более элегантное решение:
First[Unevaluated@
   NDSolve[{x''[t] + w^2 x[t] == 0, x[0] == x0, x'[0] == v0},  
    x, {t, 0, tmax}] /. {w -> 1., x0 -> 1, v0 -> 0, tmax -> 10}]
Здесь я с помощью Unevaluated одноразово защищаю от выполнения NDSolve[...], и его выполнение происходит уже после того, как замена выполнена.
 

 
На этом примере все работает. Однако сейчас возникла необходимость решить чуть более сложную систему:
 
eqns = {F''[x] + \[CapitalOmega] F[x] == I I0 J[x],  
   J''[x] +  
     2 I \[CapitalDelta] J'[x] - \[CapitalDelta]^2 J[x] == (
      I (n \[CapitalDelta] - 1))/2 F[x] + n/2 F'[x]};
incond = {F'[0] - I \[Kappa]1 F[0] == 0, J[0] == 0, J'[0] == n/2 F[0]};
vars = {F, J};
 
param = {n -> 2,  
   I0 -> 0.001, \[CapitalDelta] -> -0.5, \[CapitalOmega] ->  
    1., \[Mu] -> 18., \[Delta] -> 0.01, \[Kappa]1 -> 1., F0 -> 1};
 
numres = First@(Unevaluated@
     NDSolve[Join[eqns, Append[incond, F[0] == 1.]],  
      vars, {x, 0, \[Mu]}] //. param)
 
При этом выдается предупреждение
NDSolve::ndinnt: Initial condition 0.+(0.+1. I) \[Kappa]1 is not a number or a rectangular array of numbers. >>
 
но затем уравнения правильно решаются. Не могу понять, в чем принципиальная разница с предыдущим более простым случаем, и как сделать так, чтобы предупреждение исчезло?
 
Заранее спасибо!  
 

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 17:12 26-08-2011
popkov

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

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

Принципиальное отличие в том, что вы используете ReplaceRepeated (//.) вместо Replace. Поскольку Unevaluated защищает выражение от выполнения лишь одноразово, то при следующей итерации ReplaceRepeated NDSolve уже не защищено от выполнения (на самом деле, вы почти именно для этого и используете здесь ReplaceRepeated - чтобы аргументы NDSolve былы "выполнены", т.е., к примеру, чтобы переменная incond была заменена на ее значение. Но при таком подходе вы также выполняете сам NDSolve на слишком ранней стадии - еще до того, как сработают все необходимые итерации ReplaceRepeated). Самое очевидное решение - отложить выполнение NDSolve до момента, когда все замены внутри его аргументов будут уже выполнены (заодно и надобность в Unevaluated и ReplaceRepeated отпадает). Рекомендуемый способ - использовать Block:
Код:
numres = First@
  Block[{NDSolve},  
   NDSolve[Join[eqns, Append[incond, F[0] == 1.]],  
     vars, {x, 0, \[Mu]}] /. param]

Можно и по-другому, используя Replace:
Код:
numres = First@("NDSolve"[Join[eqns, Append[incond, F[0] == 1.]],  
      vars, {x, 0, \[Mu]}] /. param /. "NDSolve" -> NDSolve)

Или же можно задать порядок выполнения, используя скобки и Apply:
Код:
numres = First@(NDSolve @@ ({Join[eqns, Append[incond, F[0] == 1.]],  
       vars, {x, 0, \[Mu]}} /. param))

Можно, конечно, пойти и совсем очевидным путем, загромождая код заменами:
Код:
numres = First@NDSolve[Join[eqns, Append[incond, F[0] == 1.]] /. param,  
  vars /. param, {x, 0, \[Mu]} /. param]

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 22:36 12-09-2011 | Исправлено: popkov, 22:37 12-09-2011
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov
Спасибо за ответ, очень поучительно!
 
Последний способ конечно прост, но уж больно не элегантен
Первый и третий метод мне понравились. Спасибо!
 
Но, все же, вопрос остается, поскольку простой пример уравнений линейного осциллятора работает с обычным Replace. В более сложном случае, если заменить ReplaceRepeated на Replace, чтобы была полная аналогия между двумя примерами, вообще перестает работать. А в таком варианте разницы между ними я опять не могу найти.  Итак:
 
Вот это работает
First[Unevaluated@
   NDSolve[{x''[t] + w^2 x[t] == 0, x[0] == x0, x'[0] == v0},  
    x, {t, 0, tmax}] /. {w -> 1., x0 -> 1, v0 -> 0, tmax -> 10}]  
 
А вот это не работает:
 
eqns = {F''[x] + \[CapitalOmega] F[x] == I I0 J[x],  
   J''[x] +  2 I \[CapitalDelta] J'[x] - \[CapitalDelta]^2 J[x] ==
 (I (n \[CapitalDelta] - 1))/2 F[x] + n/2 F'[x]};
incond = {F'[0] - I \[Kappa]1 F[0] == 0, J[0] == 0, J'[0] == n/2 F[0]};
vars = {F, J};
param = {n -> 2,  I0 -> 0.001, \[CapitalDelta] -> -0.5, \[CapitalOmega] ->  
    1., \[Mu] -> 18., \[Delta] -> 0.01, \[Kappa]1 -> 1., F0 -> 1};
fulleqns = Flatten[{eqns, incond, F[0] == 1.}];
numres = First@(Unevaluated@NDSolve[fulleqns, vars, {x, 0, \[Mu]}] /.  
    param)
 
В последнем примере я на всякий случай полный список уравнений в NDSolve вычислил заранее и сохранил в переменной fulleqns.

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 07:09 13-09-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Andrew10
Боюсь, Вы невнимательно прочитали мой предыдущий ответ, т.к. причина, по которой не работает второй код из Вашего последнего сообщения, уже объяснена мной:
popkov
Цитата:
 вы почти именно для этого и используете здесь ReplaceRepeated - чтобы аргументы NDSolve былы "выполнены", т.е., к примеру, чтобы переменная incond была заменена на ее значение.

Дело в том, что код Unevaluated@NDSolve[fulleqns, vars, {x, 0, \[Mu]}] /. param работает следующим образом: замены (ReplaceAll) выполняются ДО выполнения NDSolve[fulleqns, vars, {x, 0, \[Mu]}], а это значит, что переменная fulleqns на этапе выполнения замены все еще присутствует в виде выражения "fulleqns", которое не содержит ничего, кроме, собственно, названия переменной. Поэтому подстановка значений параметров, определенных в param, не выполняется, и эти параметры остаются не определенными в момент вызова NDSolve.  
 
Используйте любой понравившийся метод из моего предыдущего сообщения для данного случая - фактически, две эти ситуации идентичны!

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 23:57 06-10-2011
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov
Теперь окончательно (я надеюсь ) понятно. Еще раз спасибо!

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 08:20 07-10-2011 | Исправлено: Andrew10, 08:20 07-10-2011
anynamer



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

Всего записей: 2241 | Зарегистр. 17-05-2010 | Отправлено: 20:56 19-11-2011 | Исправлено: anynamer, 18:26 20-11-2011
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возник вот такой вопрос - создаю в программе Mathematica рисунок с русскими заголовками и подписями на осях. При сохранении в pdf-формат кодировка нарушается и вместо подписей абракадабра. Можно ли это побороть?

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 22:35 02-12-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Andrew10
См. http://stackoverflow.com/q/6368642/590388
 
В настоящее время Mathematica не обладает полноценной поддержкой Юникода даже в интерфейсе (FrontEnd), а при экспорте в PDF/EPS - полноценно поддерживает только ANSI. Тем не менее, кириллические символы удается нормально экспортировать - но только с последующей "доработкой" полученного файла. По моему опыту, Adobe Acrobat Distiller в связке с Adobe Acrobat часто (но далеко не всегда) дает нормальный результат. Первый путь - экспортировать в PDF, а затем внедрить шрифты с помощью соответствующей опции Adobe Acrobat (но только если в нем кириллические символы отображаются правильно Если же нет - универсального решения мне не известно).

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 00:17 03-12-2011 | Исправлено: popkov, 00:27 03-12-2011
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov
Спасибо за ответ!  
 
Посмотрел указанную ссылку. К сожалению, рецепт с cyrFix оттуда - полумера, поскольку у меня надпись получается только моноширинным шрифтом и изменить его на другой не удалось.
С внедрением шрифтов в экспортированный PDF попробую в понедельник, т.к. дома полного Acrobata нет.

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 22:04 03-12-2011
yuk1958



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrew10
Извините, что вмешиваюсь в вашу беседу. Создал PDF файл с помощью pdf-принтера dopdf
http://narod.ru/disk/33248038001/Untitled-2.pdf.html

----------
Истина где-то рядом...

Всего записей: 1471 | Зарегистр. 12-08-2010 | Отправлено: 22:34 03-12-2011 | Исправлено: yuk1958, 22:38 03-12-2011
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
yuk1958
Мысль правильная, но нужно понимать одну вещь: подобные виртуальные принтеры работают через промежуточную конвертацию печатаемого документа в формат EMF. Несмотря на то, что это векторный формат, имеется ключевая малодокументированная особенность, как именно генерируются такие файлы: точность позиционирования всех объектов и даже узлов ломаных линий определяется не оригинальной точностью печатаемого документа, а округляется до дискретных значений, соответствующих тому, как все это будет отображаться на мониторе при данном конкретном разрешении монитора (т.е., видимо, производится подгонка под пиксельную сетку). Хорошая новость в том, что при печати можно в свойствах принтера выставить разрешение, много большее разрешения монитора (по умолчанию оно там максимальное). Плохая новость - что маленький объект (к примеру, контуры буквы) даже при таком высоком разрешении все равно будет искажен весьма заметно (это легко проверить самостоятельно). Единственный выход - масштабировать рисунок перед отправкой на печать, например, командой Magnify (работает не всегда вполне корректно). Следует также помнить, что по умолчанию Mathematica отображает на экране рисунки, используя набор стилей "Working", а выводит на печать и экспортирует в PDF, используя набор стилей "Printout". Это - те "грабли", наступив на которые, долго не можешь понять, в чем дело.

Всего записей: 1834 | Зарегистр. 22-03-2003 | Отправлено: 23:52 03-12-2011
yuk1958



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

----------
Истина где-то рядом...

Всего записей: 1471 | Зарегистр. 12-08-2010 | Отправлено: 00:03 04-12-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