Форум программистов, компьютерный форум, киберфорум
Wolfram Mathematica
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24

Wolfram Math: ADT

18.02.2012, 22:14. Показов 2155. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Только что сел за Вольфрам посчитать то, что лень руками считать, и подумал, как бы так сделать, чтоб облегчить себе жизнь. )
Первое, на чём я споткнулся, это ADT (Data Types). Как-то до этого мне вполне хватало нативных типов. Сегодня я явно захотел объявить новую структуру. Подскажите, кто знает, как это сделать.

Пусть постановка задачи
такова

Описать структуру данных Ket, которая имеет стандартный конструктор KetX[y[x,t]].
Описать двухаргументную функцию Multiply[f_,y_], которая проверяет, что оба аргумента являются Ket, и если они были созданы при помощи KetX, то возвращает Integrate[f Conjugate[y],{x,-Infinity,Infinity}].
Надеюсь описал понятно. Может, картинка ниже покажет, какой диалог я хочу видеть, когда всё будет реализовано.
Название: mimetex.cgi.gif
Просмотров: 151

Размер: 1.9 Кб

В общем, проверка аргументов реализуема (есть спец. символ /; для проверки). Но вот очень туго с пониманием того, как был определить конструктор. Ведь у типа (или как его назвать) Ket может быть не только конструктор KetX.
Пусть KetP[y[x]] — другой конструктор. Тогда я ожидаю такое поведение функции Multiply:
KetP[f[p]] ~Multiply~ KetP[g[p]] == Integrate[f[p] Conjugate@g[p],{p,-Infinity,Infinity}]
KetX[f[x]] ~Multiply~ KetX[g[x]] == Integrate[f[x] Conjugate@g[x],{x,-Infinity,Infinity}]
KetP[f[p]] ~Multiply~ KetX[g[x]] == Integrate[FourierTransform[f[p],p,x] Conjugate@g[x],{x,-Infinity,Infinity}

Именно в формулах смысла особого нет, просто хочу сказать, что у Ket может быть несколько конструкторов, определяющих представление моего объекта, но на некотором уровне абстракции я не должен знать об этих различных реализациях (KetX, KetP), довольствуясь универсальностью заданных функций (Multiply). Собственно, для этого и нужен ADT.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2012, 22:14
Ответы с готовыми решениями:

Student+ Wolfram Alpha от Wolfram Researh.
Student+ Wolfram Alpha от Wolfram Researh. Оглавление: Внимательно прочитайте данную инструкцию от начала до конца! ...

Почему Math.round(Math.random() * (max - min) дает неравномерное распределение?
Если min - 0, а max - целое. Рекомендуют Math.floor(Math.random() * (max - min + 1)) вместо Math.round(Math.random() * (max - min)) для...

Заменить Math.Min, Math.Max операторами if-else
Доброго времени. Как можно условия формул (Math.Min,Math.Max) заменить операторами if. Как в итоге код будет выглядеть. namespace New ...

1
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24
07.09.2013, 13:28  [ТС]
Не хочу показаться некромантом, просто увидел свою же тему через полтора года и понял, что сейчас я знаю, как следует сделать.

В Wolfram Mathematica определение функции, будь то lhs=rhs или lhs:=rhs производит на свет правило замены lhs->rhs и lhs:>rhs соответственно. Эти правила существуют не обособленно, а в привязке к какому-то символу (заголовку, Head). Обычно, объявление f[x_]:=P приписывается заголовку f. Но можно это менять. Для этого используется символ ^= или более конкретный /:

Ниже приведено решение. Описаны две похожие структуры: KetX и KetP — функции в прямом и обратном пространстве. Функция в прямом пространстве KetX считается доминирующей, к ней при необходимости согласовать сводится KetP.
Основной профит этого решения в расширяемости: если будет добавлено ещё какое-то представление KetZ с правилом KetX[KetZ[f_]]^:=..., функция KetXPlot будет работать и на нём без явного приведения.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(* символы x и p используются как переменные *)
KetX /: Multiply[KetX[f_], KetX[u_]] :=
  Integrate[f Conjugate[u], {x, -Infinity, Infinity}];
KetP /: Multiply[KetP[f_], KetP[u_]] :=
  Integrate[f Conjugate[u], {p, -Infinity, Infinity}];
KetX[KetP[f_]] ^:= KetX[FourierTransform[f, p, x]];
KetX[KetX[f_]] ^:= KetX[f];
(* эта  строка некрасивая *)
KetX /: Multiply[ket_KetX, KetP[u_]] := Multiply[ket, KetX[u]];
 
KetXPlot[ketList_, {xmin_, xmax_}] := 
 With[{fs = Map[KetX, ketList] /. KetX[f_] :> Abs[f]}, 
  Plot[fs, {x, xmin, xmax}, Filling -> Axis, PlotRange -> All]]
 
(* демонстрация *)
G[x0_, \[Sigma]_] := PDF[NormalDistribution[x0, \[Sigma]], x];
ket1 = KetX[G[0, 1]];
ket2 = KetX[G[2, 1]];
ket3 = KetP[1/(Sqrt[2 \[Pi]] (1 + p^2))];
 
KetXPlot[{ket1, ket2, ket3}, { -5, 5}]
Ещё можно написать предикат, определяющий, реализует ли выражение upvalue KetX.
Это наверняка можно сделать красивее, явно найдя правило KetX[_]:>... в списке UpValues (там, правда, HoldPattern сложно снять) или что-то подобное; вот работающий вариант, который проверяет, редуцируется ли KetX[f], по заголовку аргумента KetX
Haskell
1
KetQ[f_] := Not[Head[f] ~SameQ~ Replace[KetX[f], KetX[u_] :> Head[u]]]
По сути, начиная с этого момента на KetX можно смотреть как на интерфейс, принадлежность к которому определяет KetQ, а явное приведение возможно через KetX[...]

Подробнее см. Associating Definitions with Different Symbols из туториала Transformation Rules and Definitions, а также справку к UpValues и DownValues
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.09.2013, 13:28
Помогаю со студенческими работами здесь

math или не math?! вот в чем вопрос...
Доброго времени суток! Пипл подскажите у вас в VS в math.h есть такие функции, как: round trunc tgamma floor ceil ??? ...

Почему Math.sin(Math.PI) не равно 0?
Почему Math.sin(Math.PI)=1.2246467991473532e-16 ? Хотя синус от Пи должно быть равным нулю.

Windows Form Math:: или Math
Добрый день! Подскажите пожалуйста как подключить библиотеку Math или написсать namespace что бы в формулах не писать...

Float и метод Math.Ceiling и Math.Round? как округлить float?
Согласно документации Microsoft метод Math.Ceiling и Math.Round не работает с float , а только с double и decimal, не понимаю почему??? как...

Adt+DES
Здравствуйте, уважаемые форумчане. Прошу сильно не бить но есть задача: реализовать алгоритм шифрования DES. Нашел готовую програму с++ и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru