Показать полную графическую версию : [Wolfram Mathematica] Программирование в системе.
Здравствуйте.
Я не знаю, была ли на форуме подобная тема - по крайней мере, я аналогов не нашел.
Эта тема посвящена обсуждению вопросов программирования в системе Wolfram Mathematica. Я нашел только следующую статью о программировании в Математике: вот она (http://progopedia.ru/language/wolfram-mathematica/). Она не решила всех моих вопросов.
В частности, такой простой вопрос, как наличие и способ применения в Wolfram Mathematica составного оператора, для меня все еще остается открытым. Я пробовал применять "Блок" ([ ... ]), но не получил результата.
составного оператора »
Что под этим подразумевается? Какой должен быть результат?
Block[{x,y}, x=4;y=5;x+y] (*вполне работает*)
Обычно с математикой идёт толстенная книжка "The Mathematica Book", в которой всё подробно и с примерами расписано. По крайней мере я в своё время всё находил там, гуглить даже не приходилось.
pva, большое спасибо! Я про этот оператор вовсе не знал, а книжку тоже упустил из виду.
Под составным оператором я имел в виду группу операторов, объединенных в один, что дает в результате выполнение всей группы на одной итерации цикла, например. То есть я искал аналог паскалевского "begin ... end", где между этими двумя ключевыми словами помещаются несколько операторов, а выполняются они как один. И, насколько я могу видеть, "Block" является именно таким аналогом. Спасибо!
HertzToCents там работает? Что за софт, он большой? Функция весьма полезная :)
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-часовых трека студийного качества - ваш ПК такого не вытерпит. Лучше использовать специализированные инструменты.
Недавно возник следующий вопрос: как описать вектор в качестве аргумента функции (если это вообще возможно)?
Пробовал разные безыскусные варианты, конкретных инструкций не нашел.
Получить требуется функцию, которая бы оперировала элементами вектора, получая в качестве аргумента сам вектор.
AMDBulldozer
12-06-2013, 11:24
как описать вектор в качестве аргумента функции »
Определяете функцию с обычным аргументом, который в теле рассматриваете как список.
Пример:
argx[x_]:=x[[1]];
vec={4,5,6};
argx[vec]
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." Помогите, пожалуйста, понять природу этой ошибки и исправить ее.
A<>B - это операция StringJoin[A,B] - конкатенация строк. А не равно - сишное A!=B
имхо то же самое можно сделать проще: http://reference.wolfram.com/mathematica/ref/MapThread.html
M=MapThread[A,{a,Mk},2]
Существует ли способ задать в сумме 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. Простите, я понимаю, что подход очевидный и примитивный, но может быть найдете способ как-нибудь от него оттолкнуться?
http://reference.wolfram.com/mathematica/ref/MapAt.html?q=MapAt&lang=en
TaDa, больше налегай на поиск по словам в книжке (Mathematica Book)
Существует ли способ установить условия на переменную, которые соблюдались бы всюду по тексту программы?
Например, у меня фигурирует параметр, который может изменяться в интервале от нуля до единицы. Я полагаю, что, если система будет заведомо знать этот интервал, сократится время проведение расчета и вообще улучшится качество последнего.
Но, к сожалению, я не нашел подобной опции в справочнике.
AMDBulldozer
12-11-2013, 21:39
TaDa, функцией Assuming не получится воспользоваться? Или добавить его через двойной амперсенд в Solve, чтобы получилась система неравенств?
AMDBulldozer, действительно, использование функции Assuming приводит к нужному результату. Большое спасибо!
Подскажите, пожалуйста, как реализовать прикрепленную формулу.
Product с Assumptions не приводят к результату, как и вариант с Assuming и зацикленным TimesBy. Во втором случае возвращает нетронутым исходный массив, в первом - возвращается нулевой массив (т.е. Null).
я не понял, как так 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] *)
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.
Тут возник еще один вопрос: существует ли способ скопировать код из 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.