Войти

Показать полную графическую версию : [Wolfram Mathematica] Программирование в системе.


Страниц : [1] 2

TaDa
29-04-2013, 08:09
Здравствуйте.

Я не знаю, была ли на форуме подобная тема - по крайней мере, я аналогов не нашел.

Эта тема посвящена обсуждению вопросов программирования в системе Wolfram Mathematica. Я нашел только следующую статью о программировании в Математике: вот она (http://progopedia.ru/language/wolfram-mathematica/). Она не решила всех моих вопросов.

В частности, такой простой вопрос, как наличие и способ применения в Wolfram Mathematica составного оператора, для меня все еще остается открытым. Я пробовал применять "Блок" ([ ... ]), но не получил результата.

pva
29-04-2013, 20:03
составного оператора »
Что под этим подразумевается? Какой должен быть результат?


Block[{x,y}, x=4;y=5;x+y] (*вполне работает*)


Обычно с математикой идёт толстенная книжка "The Mathematica Book", в которой всё подробно и с примерами расписано. По крайней мере я в своё время всё находил там, гуглить даже не приходилось.

TaDa
30-04-2013, 05:57
pva, большое спасибо! Я про этот оператор вовсе не знал, а книжку тоже упустил из виду.

Под составным оператором я имел в виду группу операторов, объединенных в один, что дает в результате выполнение всей группы на одной итерации цикла, например. То есть я искал аналог паскалевского "begin ... end", где между этими двумя ключевыми словами помещаются несколько операторов, а выполняются они как один. И, насколько я могу видеть, "Block" является именно таким аналогом. Спасибо!

semiono
30-04-2013, 15:46
HertzToCents там работает? Что за софт, он большой? Функция весьма полезная :)

pva
01-05-2013, 19:49
semiono, насколько я понял из википедии:
перевод интервала частот в центы:

(*Mathematica*)
HertzToCents[hertz1_,hertz2_]:=Log[2,hertz2/hertz1]*1200


/*c/c++*/
double HertzToCents(double hertz1, double hertz2) {
/* 1200./log(2) = 3986,3137138648348174443833153873 */
return log(hertz2/hertz1)*3986.3137138648348174443833153873;
}

Софт большой (хотя гораздо меньше, чем windows) и не дешёвый.

Функция весьма полезная »
Функция очень специфичная (кроме музыки думаю нигде не применяется; и в музыке не везде наверное) и просто реализуемая, поэтому скорее всего готовой реализации там нет.

Несмотря на универсальность, "Математика" заточена для математических расчётов (соответсвенно расставлены акценты в реализации). Сложить 20 коротких треков не составит труда, но сложить 2 2-часовых трека студийного качества - ваш ПК такого не вытерпит. Лучше использовать специализированные инструменты.

TaDa
12-06-2013, 05:05
Недавно возник следующий вопрос: как описать вектор в качестве аргумента функции (если это вообще возможно)?

Пробовал разные безыскусные варианты, конкретных инструкций не нашел.

Получить требуется функцию, которая бы оперировала элементами вектора, получая в качестве аргумента сам вектор.

AMDBulldozer
12-06-2013, 11:24
как описать вектор в качестве аргумента функции »

Определяете функцию с обычным аргументом, который в теле рассматриваете как список.
Пример:

argx[x_]:=x[[1]];
vec={4,5,6};
argx[vec]

TaDa
01-07-2013, 08:09
AMDBulldozer, спасибо! Оказывается, надо было использовать отложенное присваивание вместо мгновенного.

Недавно я попытался написать код следующего вида:

A[x_, y_] := If[x <> 0, 3/2*y/(x^2*B), Limit[3/2*y/(x^2*B), x -> 0]]
M = Table[A[a[[i, j, k]], Mk[[i, j, k]]], {i, 1, 5}, {j, 1, Length[Mk[[i]]]}, {k, 1, Length[Mk[[i, j]]]}]Таким образом я пытаюсь реализовать следующий алгоритм:

1. Задаю отдельной функцией А(х, у) условие и два варианта в зависимости от выполнения условия.
2. Пытаюсь применить эту функцию к массивам а иМк и вывести результат в отдельный массив (таблицу) М.

Однако на втором этапе возникает ошибка:

StringJoin::string: "String expected at position 1 in (-1.04765)<>0." Помогите, пожалуйста, понять природу этой ошибки и исправить ее.

pva
01-07-2013, 22:32
A<>B - это операция StringJoin[A,B] - конкатенация строк. А не равно - сишное A!=B

имхо то же самое можно сделать проще: http://reference.wolfram.com/mathematica/ref/MapThread.html

M=MapThread[A,{a,Mk},2]

TaDa
19-08-2013, 08:50
Существует ли способ задать в сумме Sum[] или произведении Product[] дополнительное условие на индексы? И в чем состоит этот способ?

Поясню на примере: я бы хотел реализовать в Wolfram Mathematica формулу Лагранжа для многомерной интерполяции. На нее можно взглянуть, например, здесь:

http://stu.sernam.ru/book_dig_m.php?id=15

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

AMDBulldozer
19-08-2013, 20:25
Существует ли способ задать в сумме Sum[] или произведении Product[] дополнительное условие на индексы? И в чем состоит этот способ? »
Если честно, никогда не сталкивался с подобной задачей, но, возможно, Вашу задачу решил бы самый простой подход - определить весовую функцию от индексов.
Допустим, Вы хотите вычислить след матрицы. Сделаем это, определив зависимости между индексами так, чтобы учитывались только элементы на диагонали матрицы (естественно, просто для примера - в реальной жизни любого человека, который считает след в Mathematica подобным образом надо срочно госпитализировать в Кащенко как идиота):

Aij = Table[A, {i, 10}, {j, 10}]
z[i_,j_] := If [ i==j, 1, 0 ]
Sum[Sum[z[i, j]Aij[[i, j]], {j, 10}], {i, 10}]

[i]P.S. Простите, я понимаю, что подход очевидный и примитивный, но может быть найдете способ как-нибудь от него оттолкнуться?

pva
19-08-2013, 20:48
http://reference.wolfram.com/mathematica/ref/MapAt.html?q=MapAt&lang=en
TaDa, больше налегай на поиск по словам в книжке (Mathematica Book)

TaDa
12-11-2013, 21:23
Существует ли способ установить условия на переменную, которые соблюдались бы всюду по тексту программы?

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

Но, к сожалению, я не нашел подобной опции в справочнике.

AMDBulldozer
12-11-2013, 21:39
TaDa, функцией Assuming не получится воспользоваться? Или добавить его через двойной амперсенд в Solve, чтобы получилась система неравенств?

TaDa
13-11-2013, 04:49
AMDBulldozer, действительно, использование функции Assuming приводит к нужному результату. Большое спасибо!

TaDa
14-11-2013, 20:14
Подскажите, пожалуйста, как реализовать прикрепленную формулу.

Product с Assumptions не приводят к результату, как и вариант с Assuming и зацикленным TimesBy. Во втором случае возвращает нетронутым исходный массив, в первом - возвращается нулевой массив (т.е. Null).

pva
15-11-2013, 10:17
я не понял, как так k=1, k!=1

Обычно сама математика пишет такие формулы в виде

phi[m_][x_] := Product[(x-x[k])/(x[m]-x[k]), {k,1,n}]

При этом x объявлета как функция (по аналогии с константами интегрирования C[n])

Странно, что не получается реализовать её в виде таблицы, должно получиться:

x = Table[...]
phi[x1_]=Table[Times@@((x1-x)/(x[m]-x)), {m,1,Length[x]}]] (*здесь x1 должна быть таблицей длины Length[x] *)


Ещё вариант: (мой любимый, но без пол-литра не поймёшь, куда посылает)

x = Table[...]
phi[x1_]:=(Times@@((x1-x)/(#1-x))&)/@x (*здесь x1 должна быть таблицей длины Length[x] *)

TaDa
24-11-2013, 14:27
pva, в формуле, к сожалению, ошибка, должно быть k != m.

Удалось реализовать это дело с помощью следующего кода:

Psi1[Nu_, m_] := Product[(Nu - NuRoots[[k]])/(NuRoots[[m]] - NuRoots[[k]]), {k, Delete[Range[1, n1], m]}]В массиве NuRoots лежат точки; все это делается для получения аппроксимирующей функции, точнее - работает формула Гаусса-Кристоффеля для вычисления несобственного интеграла.

Тут возник еще один вопрос: существует ли способ скопировать код из Mathematica в Microsoft Word так, чтобы в документ пошла "красивая" запись кода? Может, через MathType как-нибудь?

AMDBulldozer
24-11-2013, 15:44
существует ли способ скопировать код из Mathematica в Microsoft Word так, чтобы в документ пошла "красивая" запись кода? »
Боюсь, что не могу подсказать - никогда не возникало такой необходимости. При желании всегда можно подготовить документ в самой Mathematica (написана же ней самой вся справочная система, правда?) и экспортировать в PDF. Посмотрите доступные типы в "Save as", может быть что-нибудь Вам подойдет. К тому же, для сохранения отдельных результатоы вычислений можно пользоваться функцией Export. Допустимые форматы экспорта содержатся в переменной $ExportFormats.

pva
25-11-2013, 10:45
Тут возник еще один вопрос: существует ли способ скопировать код из Mathematica в Microsoft Word так, чтобы в документ пошла "красивая" запись кода? Может, через MathType как-нибудь? »
Я всегда копировал как метафайл и вставлял картинкой. Это было в 4.1, сейчас не знаю, что в математике есть.
Плюсы: формулы набираются быстро и выглядят красиво (по сравнению с вордовским плагином)
Минусы: надо тащить с собой шрифты математики (штук 6). Иначе в документе каша.
Делал статьи полностью в математике - тоже вариант (потом можно экспортировать в латех).

Product[(Nu - NuRoots[[k]])/(NuRoots[[m]] - NuRoots[[k]]), {k, Delete[Range[1, n1], m]}] »

а можно сделать так (используя свойства произведения):

phi[m_][x_] := Product[If[k==m,1,(x-x[k])/(x[m]-x[k])], {k,1,n}]


с табличным вариантом поможет комбинация Drop и MapIndexed (я уже полез в хелп за примером)




© OSzone.net 2001-2012