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

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

Автор: S4astliff4ik
Дата сообщения: 01.12.2009 08:49
popkovок,попробую...


Добавлено:
popkovок,попробую...
Автор: AlexeyTr
Дата сообщения: 27.12.2009 11:15
А где достать хелп/документацию к 7-й версии?
Автор: Partner1
Дата сообщения: 22.02.2010 18:08
The Mathematica Journal стал вроде-бы бесплатным:
www.mathematica-journal.com
Автор: eriik
Дата сообщения: 22.02.2010 20:43
Partner1

Цитата:
The Mathematica Journal стал вроде-бы бесплатным:
www.mathematica-journal.com
Серьезно?
А я еще помню те времена, когда серьезные дяди и тёти шарились по китайским поисковикам в поисках паролей-аккаунтов с валидной подпиской на TMJ, и ведь находили ж ! ) А все чтобы почитать tips-n-tricks от паши турротова, ...
Автор: Partner1
Дата сообщения: 22.02.2010 21:08
eriik

Цитата:
Серьезно?
А я еще помню те времена, когда серьезные дяди и тёти шарились по китайским поисковикам в поисках паролей-аккаунтов с валидной подпиской на TMJ

Надо-же, и я так делал
h_tt_p://www.bugmenot.com/view/mathematica-journal.com
Автор: kyznez1
Дата сообщения: 24.02.2010 17:40
Здравствуйте. У меня такой вопрос:
можно ли как-нибудь сделать чтобы Математика отображала дробь в обычном (не многоэтажном) виде? N[] не катит, т.к нужно сохранение в ответе переменных, корней и т.д.
Автор: popkov
Дата сообщения: 24.02.2010 22:04
kyznez1

Цитата:
[no]In[1]:=[/no] InputForm[1/2][no]
Out[1]//InputForm=
1/2[/no]
Автор: kyznez1
Дата сообщения: 27.02.2010 08:09
popkov
я имею в виду, чтоб дробь 1/(1 + 1/a^2) отображалась в виде a^2/(a^2+1)
Автор: popkov
Дата сообщения: 27.02.2010 10:54
kyznez1

Цитата:
я имею в виду, чтоб дробь 1/(1 + 1/a^2) отображалась в виде a^2/(a^2+1)

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

[no]In[1]:=
f[e_] := 100 Count[e, Power[_, _?Negative], {0, Infinity}] + LeafCount[e]
mySimplify := Simplify[#, ComplexityFunction -> f] &;

In[3]:= mySimplify[1/(1 + 1/a^2)]

Out[3]= a^2/(1 + a^2)[/no]
Автор: terminat0r
Дата сообщения: 09.04.2010 13:10
Пришлось плотно столкнуться с математикой 7 неделю назад. Оговорюсь что это была 64бит версия под линукс, но!
Коллеги, как вы на ней считаете, это ведь тихий, но очень падучий ужас. Она вылетает от дуновения ветра, интерфейс переключается как в замедленной сьемке, несмотря на четыре ксеоновские 3 Ггц овые ядра на компе. За час работы оно падает не мене 4 раз.


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

Если кому не сложно, проверьте на своей версии вот такой график
[more]
jl[l_,r_]:=Sqrt[Pi/(2*r)]*BesselJ[l+1/2,r]

r0 := 1

Rp[l_,ki_,kf_,r0_]:=Integrate[jl[l+1,kf*r]*jl[l,ki*r]*r^3,{r,0,r0}]

Rm[l_,ki_,kf_,r0_]:=Integrate[jl[l-1,kf*r]*jl[l,ki*r]*r^3,{r,0,r0}]

beta[ki_,kf_,l_,delta_]:=(l*(l-1)*N[Rm[l,ki,kf,r0]]^2+(l+1)*(l+2)*N[Rp[l,ki,kf,r0]]^2-6*l*(l+1)*N[Rm[l,ki,kf,r0]]*N[Rp[l,ki,kf,r0]]*Cos[delta])/((2*l+1)*(l*N[Rm[l,ki,kf,r0]]^2+(l+1)*N[Rp[l,ki,kf,r0]]^2))

Num:=N [beta[1,k,1,\[Pi]]]

Plot[Num,{k,1,5}]

NumBeta[kf_]:=N[beta[1,kf,1,1]]

Plot[NumBeta[x],{x,2,6}]



Кому интересно, вот почти то же самое в Maple

restart;
alias(J=BesselJ);alias(Z=BesselJZeros);
jl:=(_l,_r)->sqrt(Pi/(2*_r))*J(_l+1/2,_r);
Rp:=(l,ki,kf,r0)->int(jl(l+1,kf*r)*jl(l,ki*r)*r^3, r = 0 .. r0);
Rm:=(l,ki,kf,r0)->int(jl(l-1,kf*r)*jl(l,ki*r)*r^3, r = 0 .. r0);
beta:=(l,RM,RP,delta)->(l*(l-1)*RM^2+(l+1)(l+2)*RP^2-6*l*(l+1)*RM*RP*cos(delta))/((2*l+1)*(l*RM^2+(l+1)*RP^2));
plot(evalf(beta(1,evalf(Rm(1,1,kf,1)),evalf(Rp(1,1,kf,1)),0)), kf=1..6);

[/more]
Автор: Griefin
Дата сообщения: 09.04.2010 14:57
terminat0r
Видимо это потому что Mathematica тупо делает символьное интегрирование каждый раз при вызове функции, без кэширования результатов. Замена Integrate на NIntegrate дает значительный выигрыш в скорости. С другой стороны, интегралы от двух функций Бесселя есть в таблицах Прудникова-Брычкова-Маричева, лучше сразу использовать общую формулу оттуда. Там в общем случае возникают гипергеометрические ряды, так что проще будет считать эти интегралы численно. Зачем повсюду столько N[]? Они тоже создают тормоза. Кроме того, Plot значительно ускоряется, если выставить опцию MaxRecursion->0.

[more=Исправленный вариант, который на процессоре Q6600 считается примерно за 2 секунды]
jl[l_, r_] := SphericalBesselJ[l, r]

r0 := 1

Rp[l_, ki_, kf_, r0_] :=
NIntegrate[jl[l + 1, kf*r]*jl[l, ki*r]*r^3, {r, 0, r0}]

Rm[l_, ki_, kf_, r0_] :=
NIntegrate[jl[l - 1, kf*r]*jl[l, ki*r]*r^3, {r, 0, r0}]

beta[ki_, kf_, l_, delta_] := (l*(l - 1)*Rm[l, ki, kf, r0]^2 + (l + 1)*(l + 2)*
Rp[l, ki, kf, r0]^2 -
6*l*(l + 1)*Rm[l, ki, kf, r0]*Rp[l, ki, kf, r0]*
Cos[delta])/((2*l +
1)*(l*Rm[l, ki, kf, r0]^2 + (l + 1)*Rp[l, ki, kf, r0]^2))

Num := beta[1, k, 1, \[Pi]]

Plot[Num, {k, 1, 5}, MaxRecursion -> 0]
[/more]
Автор: terminat0r
Дата сообщения: 09.04.2010 17:34
Griefin
СПАСИБО!
Ваши замечания очень ценны, так как я только сейчас вплотную столкнулся с математикой, до этого делал в maple и не было особенной мотивации. (сейчас есть )
А мой сарказм постом раньше -это результат 5 дней тотальной борьбы с mathematica.
Автор: popkov
Дата сообщения: 09.04.2010 18:26
terminat0r
В качестве краткого и информативного пособия для начала рекомендую книгу Леонида Шифрина "Mathematica® programming: an advanced introduction". Простота изложения сочетается с рассмотрением потенциальных "грабель" и "тонких" мест программирования, имеющих большую ценность на практике и не всегда известных даже опытным пользователям.
Автор: terminat0r
Дата сообщения: 11.04.2010 02:14
popkov
Спасибо, очень хорошая книга, читаю.
Автор: TomasVercetti
Дата сообщения: 02.05.2010 10:18
Приветствую всех!

А в Mathematica7 есть named arguments: f[x=5, y=7, z=10]? (В принципе, под это дело можно Optional Arguments пристроить, но, может быть, «фича» уже реализована.)
Автор: eriik
Дата сообщения: 02.05.2010 12:14
TomasVercetti

Цитата:
(p.205)

Default arguments are those which we can leave out when calling a function, in which case there are some default values that the function will use for these arguments. The matching between missed arguments and values is based on the positions of the arguments in this case. In Mathematica, this mechanism is realized through optional patterns (section 4.2.9). We will give just a few simple examples of such functions. Here we define a function which sums all its arguments, and has the last two arguments optional, with default values being 1 and 2 :

ClearAll[f];

f[x_, y_: 1, z_: 2] := x +y +z

Check :

{f[1], f[1, 3], f[1, 3, 5]}

{4, 6, 9}

Кроме этого ничего на ум не приходит...

p.s. Не совсем понял смысл named arguments - это аналог With[] что ли?
Автор: dikun
Дата сообщения: 02.05.2010 14:41

Цитата:
А в Mathematica7 есть named arguments [...]?


Похоже, что нету.
Вообще, при помощи Optional Arguments и советуют это реализовывать:
http://stackoverflow.com/questions/1615836/named-arguments-in-mathematica
Причины?
1. Всякие там "\[Element]", ":>", "===", "->" и т.д. уже заняты.
2. Последовательность аргументов самоочевидна/привычна (и тогда зачем нам нужны named arguments?), иначе речь идёт не просто об аргументах, а об опциях (и порядок перечисления аргументов уже не важен).
3. В Mathematica принято давать нормальные вменяемые имена идентификаторам, что улучшает читабельность/понятность кода.
Автор: TomasVercetti
Дата сообщения: 02.05.2010 19:51
eriik,
Named arguments — возможность указывать имена аргументов в вызове функции. Т.е., задана функция f[x_,y_,z_]; при её вызове вместо f[5, 7, 10] можно писать f[x=5, y=7, z=10]. Становится очень полезно, когда количество аргументов увеличивается до десятка и упомнить, что каждый из них представляет, становится сложно. Тем более, если несколько похожих по смыслу функций.

dikun,
Интересные примеры по ссылке! Видимо, Optional Arguments под это дело и должны использоваться. Придётся только проверять, чтобы каждый из аргументов был присвоен (отличался от «по-умолчанию») — думал, что эта функциональность уже могла быть реализована.
Автор: eriik
Дата сообщения: 03.05.2010 13:13
TomasVercetti
Спасибо за объяснение. Т.е. функциональность - чистая косметика, этакий "in situ" комментарий? Согласен, иногда не помешает
Автор: dikun
Дата сообщения: 03.05.2010 14:04
@TomasVercetti

Если аргументов у функции много, при этом их все нужно в обязательном порядке фактически определять, то я позволю себе предположить, что эти аргументы могут быть сгруппированы при помощи каких-то Head'ов, например, List[...] или Circle[{x0, y0}, R].

Если есть "несколько похожих по смыслу функций", то, опять-таки, предположу, что мы имеем дело с некой одной полиморфной сущностью, которая проявляется в виде этих "похожих по смыслу функций".

Если бы ты привёл здесь описание и прототипы своих функций с большим количеством обязательных аргументов, то, возможно, тут тебе порекомендовали бы, что с этими функциями делать...
Автор: Griefin
Дата сообщения: 03.05.2010 14:24
Делать все аргументы опциональными тоже глупо, т.к. нельзя будет перегружать функции. Не надо пытаться плевать против ветра, язык есть язык и вы неизбежно столкнетесь с его ограничениями. Несколько часто изменяемых аргументов должны быть обязательными, а остальные можно вынести в опции. Однотипные аргументы, например, координаты или квантовые числа, лучше группировать в списки. При вызове одной функции из другой, со списком аргументов можно работать как с одной переменной.
Автор: TomasVercetti
Дата сообщения: 03.05.2010 15:57
Пока выбрал такой вариант FermiEnergy[temp,conc,{прочие параметры},{хар-ки матрицы}, {хар-ки примеси}, опциональные_аргументы]. Не очень нравится тем, что 1. некоторые хар-ки матрицы зависят от хар-к примеси; 2. Часть из них пришлось вынести в опциональные.

Вообще функции имеют такой вид: FermiEnergyA[temp,conc, v1,v2,v3, ni, e1,e2,e3,e4] — используется один метод, FermiEnergyB[temp,conc, v1,v2,v3, ni, nm, e1,e2,e3] — другой метод для другого набора экспериментально определяемых значений параметров, FermiEnergyC[temp,conc, v1, ni, nm, nz, e1,e2,e3, m] — третий.

Разумеется, каждый раз при вызове приходится смотреть, какой аргумент и на каком месте стоит. Хотелось бы что-то типа FermiEnergyA[temp=5, conc=c, v1=1,v2=1,v3=5, ni=10^18, e1=...,e2=...,e3=...,e4=...]. Если порядок не важен — ни плюс, ни минус. В идеале, в зависимости от того, какие параметры указаны, функция сама выбирает метод.
Автор: Griefin
Дата сообщения: 03.05.2010 16:58
Теоретически в Mathematica можно написать даже свой парсер аргументов, было бы желание. Но надо понимать, что это займет много больше времени, чем решение прикладной задачи теми средствами, что уже есть. Если интересует большая гибкость синтаксиса, то нужно обратиться к функциональным языкам, типа Haskell. Там наверняка уже реализовано все, что можно пожелать. Но в языках общего назначения нет богатого набора готовых реализаций алгоритмов для физических и математических расчетов.


Цитата:
FermiEnergyA, B, C

Функции можно перегружать (создавать несколько функций с одинаковыми именами, но с разным набором аргументов).
Автор: DeadJDona
Дата сообщения: 05.05.2010 17:31
подскажите плиз, как посмотреть решение дифура?
трейс-дсолв не показывает ((
Автор: popkov
Дата сообщения: 11.05.2010 21:08
DeadJDona
Логика компьютерных систем сильно отличается от человеческой и на практике вряд ли полезна. Можно включить вывод всех промежуточных операций вообще (осторожно! печатаются тысячи сообщений!):

On[];
DSolve[y'[x] == Sin[x], y[x], x]

При желании можно указать фильтр только интересующих типов операций - но толку вряд ли будет больше...
Автор: cdrom2
Дата сообщения: 15.05.2010 18:53
Помогите
Каким пакетом (on-line калькулятор тоже подойдет) можно решить такое уравнение
1.int[(х),а] F(t)dt=в (с неизвестным пределом интегрирования), где а и в - могут быть математическими константами (pi, e... и т.д. )
2. F(x)=G(x) (F(x) и G(x) - спецфункции)
Спасибо.

Автор: popkov
Дата сообщения: 16.05.2010 09:13
cdrom2
Mathematica и MatLab это точно могут (численными методами). Думаю, многие другие пакеты тоже (если реализованы необходимые тебе спецфункции).
Автор: Someek
Дата сообщения: 19.05.2010 21:50
всем здравствуйте) может я немного не в тему, но у меня есть вопросик по Mathematica.
вообщем,я только начинаю ее осваивать и возникла проблема...
d := 1
c := 8
t := 0
e := 0
A:= 67
o:=-3
While[o &#8800; 1; {m = Select[Range[100], Mod[( d # + c), o] == 0 &], If[o < 0, o = -o], t = c,
c = (t*m[[1]] + A*d)/o, e = d, d = (e* m[[1]] + t)/o, o = c^2 - A*d^2 , Print["x=", d],
Print["y=", c]}]

цикл,не знаю почему, работает только 1 раз. подскажите в чем ошибка...
заранее спасибо)
Автор: popkov
Дата сообщения: 19.05.2010 23:52
Someek
Для начала, в твоем коде ошибка:
Цитата:
o &#8800;
Что это значит? Проверяй код после публикации!
Автор: Someek
Дата сообщения: 20.05.2010 06:44
извините,не заметил. Это означает "не равно 1".

Страницы: 12345678910111213141516171819202122232425262728293031323334

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


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