Трехмерные графики
Функция Plot3D используется для построения трехмерных графиков в декартовых координатах:
Plot3D[x^2 - y^2 , , ]
С помощью функции ParametricPlot3D построим трехмерную пространственную кривую:
ParametricPlot3D[, ]
Для работы в сферических координатах используется функция SphericalPlot3D:
SphericalPlot3D[Sin[\[Theta]], , ]
Функция RevolutionPlot3D строит поверхность вращения с использованием заданного выражения:
RevolutionPlot3D[x^4 - x^2, ]
Как подписать график в wolfram mathematica
Последний раз редактировалось TelmanStud 02.06.2014, 11:06, всего редактировалось 1 раз.

Хотя проблема уже и решена, укажу ещё один полезный приём.
Можно просто скопировать сам график и вставить его в Show :
Это удобно в тех случаях, когда графика уже нет в оперативной памяти (вы перезагрузили ядро или открыли сохранённый на диске документ).
Цена действительно самая низкая из таких пакетов.
Последний раз редактировалось mechanic50 23.06.2014, 19:32, всего редактировалось 2 раз(а).
Сдвигались данные в окне графикоВ вправо и влево по мере движения «движка».
т.е. есть например 10 000 точек, и есть три расчитанных на этих данных характеристики этих точек — типа скорости и пр., вот вот что-бы более удобно просматривать, все графики хочется в одном окне и что-бы снизу был движок позволяющию прокуручивать данные вправо и влево, т.к. просматривать все 10 000 точек в одном окне нереально, прокручивать данные — проще и виднее.
Как именно работает функция Evaluate в Wolfram Mathematica. Как это имеет значение на двух графиках ниже
Пытаюсь понять, как именно работает функция Evaluate. Здесь у меня есть два примера, и единственное различие между ними — функция Evaluate.
Первый сюжет с Evaluate.
Второй сюжет без оценки.
Пожалуйста, объясните, как Evaluate имеет здесь значение.
который должен отображать ваш график, за которым следует 52020 = 51 * 51 * 20, потому что у вас есть таблица 51 * 51, и каждая запись должна оценивать 20 итераций вашей суммы
который должен отображать ваш график, за которым следует 20, потому что Evaluate необходимо выполнить 20 итераций вашей Sum только один раз, даже если вы видите на экране 51 * 51 блоков разных цветов.
Вы получите те же самые подсчеты, без графики, если вы удалите ReliefPlot из каждого из них, так что кажется, что это показывает, что не ReliefPlot отвечает за количество вычислений вашего RandomReal, это таблица .
Таким образом, Evaluate переводит внешний текст вашей записи Table во внутреннюю форму и сообщает Table, что это уже было сделано и не нужно повторять для каждой итерации таблицы.
То, что вы помещаете и видите на экране, — это интерфейс Mathematica. За этим скрывается серверная часть, на которой выполняется большая часть фактических вычислений. Передняя и задняя части взаимодействуют друг с другом во время ввода, вычислений, вывода и отображения.
Но это все еще не дает ответа на вопрос, почему два графика выглядят так по-разному. Я предполагаю, что когда вы не используете Evaluate и, таким образом, не отмечаете результат таблицы как завершенный и завершенный, ReliefPlot будет повторно проверять это выражение в вашей таблице, и это выражение будет каждый раз другим из-за RandomReal и это то, что отображает более гладкую отображаемую графику с более высоким разрешением. Но когда вы используете Evaluate и, таким образом, таблица помечается как выполненная и завершенная и не требует дальнейшей оценки, ReliefPlot просто использует значения 51 * 51 без пересчета или проверки, и вы получаете ReliefPlot с более низким разрешением.
Как и почти во всей системе Mathematica, детали алгоритмов, используемых для каждой из тысяч различных функций, недоступны. Иногда вкладки «Параметры» и «Подробности» на странице справки для данной функции могут предоставить дополнительную информацию. Иногда эксперименты могут помочь вам угадать, что происходит за кодом. Иногда другие очень умные люди выясняли некоторые части поведения и публиковали описания. Но это, наверное, все, что есть.
Wolfram alpha на русском языке. Wolfram mathematica как пользоваться, вольфрам альфа построить график онлайн
Чтобы получить решение уравнения вида достаточно записать в строке Wolfram|Alpha: f[x]=0, при этом Вы получите некоторую дополнительную информацию, которая генерируется автоматически. Если же Вам необходимо только решение, то необходимо ввести: Solve=0, x].
- Solve+Cos+Sin=0,x] или Cos[x]+Cos+Sin=0;
- Solve или x^5+x^4+x+1=0;
- Solve-Log=0,x] или \Log-Log=0.
Если Ваше уравнение содержит несколько переменных, то запись: f=0 даст весьма разнообразный набор сведений, таких как решение в целых числах, частные производные функции и т. д. Чтобы получить решение уравнения вида по какой-либо одной из переменных, нужно написать в строке: Solve=0, j], где — интересующая Вас переменная.
- Cos=0 или Solve=0,x] или Solve=0,y];
- x^2+y^2-5=0 или Solve или Solve;
- x+y+z+t+p+q=9.
Решение неравенств
Решение в Wolfram Alpha неравенств типа , полностью аналогично решению уравнения . Нужно написать в строке WolframAlpha: f[x]>0 или f[x]>=0 или Solve>0, x] или Solve>=0,x].
- Cos-1/2>0 или Solve-1/2>0,x];
- x^2+5x+10>=0 или Solve.
Если Ваше неравенство содержит несколько переменных, то запись: f>0 или f>=0 даст весьма разнообразный набор сведений, как и в случае соответствующих уравнений. Чтобы получить решение такого неравенства по какой-либо одной из переменных нужно написать в строке: Solve>0,j] или Solve>=0,j], где — интересующая Вас переменная.
- Cos>0 или Solve>0,x] или Solve>0,y];
- x^2+y^3-5 =9.
Решение различных систем уравнений, неравенств и уравнений
Решение систем различного вида в Wolfram Alpha крайне просто. Достаточно набрать уравнения и неравенства Вашей системы, точно так, как это описано выше в пунктах 7. и 8., соединяя их союзом «И», который в Wolfram Alpha имеет вид &&.
- x^3+y^3==9&&x+y=1;
- x+y+z+p==1&&x+y-2z+3p=2&&x+y-p=-3;
- Sin+Cos==Sqrt/4&&x+y²=1;
- Log=0&&x+y+z Построение графиков функций
- Plot;
- Plot;
- Plot^x, ];
- Plot^x, , ].
Если Вам требуется построить сразу несколько графиков на одном рисунке, то перечислите их, используя союз «И»:Plot&&g[x]&&h[x]&&…&&t[x], ].
- Plot;
- Plot&&Sin&&Sin&&Sin, ].
Для того, чтобы построить график функции на прямоугольнике , нужно написать в строке Wolfram Alpha: Plot, , ]. К сожалению, диапазон изменения аппликаты пока что нельзя сделать конкретным. Тем не менее, интересно отметить, что при построении графика функции Вы получите не только поверхность, которую она определяет, но и «контурную карту» поверхности (линии уровня).
Математический анализ
Wolfram Alpha способен находить пределы функций, последовательностей, различные производные, определенные и неопределенные интегралы, решать дифференциальные уравнения и их системы и многое многое другое.
Пределы
Для того, чтобы найти предел последовательности нужно написать в строке Wolfram Alpha: Limit.
- Limit;
- Limit[(1+1/n)^n, n -> Infinity].
Найти предел функции при можно совершенно аналогично: Limit, x -> a].
- Limit/x, x -> 0];
- Limit[(1-x)/(1+x), x -> −1].
Производные

Для того, чтобы найти производную функции нужно написать в строке WolframAlpha: D, x]. Если Вам требуется найти производную n-го порядка, то следует написать: D, ]. В том случае, если Вам требуется найти частную производную функции напишите в окне гаджета: D, j], где — интересующая Вас переменная. Если нужно найти частную производную по некоторой переменной порядка n, то следует ввести: D, ], где означает тоже, что и Выше.
Важно подчеркнуть, что Wolfram Alpha выдает пошаговое нахождение производной при нажатии на «Show Steps» в правом верхнем углу выдаваемого ей ответа.
Интегралы
Для того, чтобы найти неопределенный интеграл от функции нужно написать в строке WolframAlpha: Integrate f[x], x. Найти определенный интеграл так же просто: Integrate, ] либо Integrate f(x), x=a..b.
Важно подчеркнуть, что Wolfram Alpha выдает пошаговое нахождение интеграла при нажатии на «Show Steps» в правом верхнем углу выдаваемого ей ответа.
- Integrate/x², x];
- Integrate, x];
- Integrate[(x+Sin[x])/x, ];
- Integrate/x^5, ].
Дифференциальные уравнения и их системы
Чтобы найти общее решение дифференциального уравнения нужно написать в строке WolframAlpha: F (при k-й производной y ставится k штрихов).
Если Вам требуется решить задачу Коши, то впишите: F, y[s]==A,y»[s]==B, …. Если нужно получить решение краевой задачи, что краевые условия, так же перечисляются через запятую, причем они должны иметь вид y[s]==S.
Решение систем дифференциальных уравнений также просто, достаточно вписать: , где f_1, f_2, …, f_n — дифференциальные уравнения, входящие в систему. К сожалению, решение задач Коши и краевых задач для систем дифференциальных уравнений пока-что не поддерживается.
- y»»»+y»»+y=Sin[x];
- y»»+y»+y=ArcSin[x];
- y»»+y+y^2=0;
- y»»=y, y==0, y»=4;
- y+x*y»=x, y=2;
- y»»»[x]+2y»»[x]-3y»[x]+y=x, y=1, y=2, y»=2;
- .
Ошибки при работе с системой
Система может допускать некоторые ошибки при решении сложных задач. К примеру, если попытаться решить неравенство , для чего ввести запрос solve (3x^2-18x+24)/(2x-2)-(3x-12)/(2x^2-6x+4) Laurent expansion z*cos(1/z) at z =0
Найти вычет функции в точке:
residue of (e^(1/(1-z^2))/((1-e^z)* sin(z^2))) at point z = 0
Чтобы упростить выражение f[x], наберите команду Simplify]
Комплексно сопряженное z*
Египетская дробь:
Egyptian fraction expansion:
Обратное преобразование Лапласа — ILT (находим оригинал по изображению)
2
1. Решение рациональных, дробно-рациональных уравнений любой степени, показательных, логарифмических, тригонометрических уравнений.
Пример 1. Чтобы решить уравнение x 2 + 3x — 4 = 0,нужно ввести solve x^2+3x-4=0
Пример 2. Чтобы решить уравнение log 3 2x = 2, нужно ввести solve log(3, 2x)=2
Пример 3. Чтобы решить уравнение 25 x -1 = 0.2 , нужно ввести solve 25^(x-1)=0.2
Пример 4. Чтобы решить уравнение sin x = 0.5, нужно ввести solve sin(x)=0.5
2. Решение систем уравнений.
Пример . Чтобы решить систему уравнений
x + y = 5,
x — y = 1,
нужно ввести solve x+y=5 && x-y=1
3. Решение рациональных неравенств любой степени.
Пример . Чтобы решить неравенство x 2 + 3x — 4 0,
нужно ввести solve x^2+3x-4 0
Знаки && в данном случае обозначает логическое «И».
5. Раскрытие скобок + приведение подобных в выражении.
Пример . Чтобы раскрыть скобки в выражении (c+d ) 2 (a-c ) и привести подобные, нужно
ввести expand (c+d)^2*(a-c).
6. Разложение выражения на множители.
Пример . Чтобы разложить на множители выражение x 2 + 3x — 4, нужно ввести factor x^2 + 3x — 4.
7. Вычисление суммы n первых членов последовательности (в том числе арифметической и геометрической прогрессий).
Пример . Чтобы вычислить сумму 20 первых членов последовательности, заданной формулой a n = n 3 +n , нужно ввести sum n^3+n, n=1..20
Если нужно вычислить сумму первых 10 членов арифметической прогрессии , у которой первый член a 1 = 3, разность d = 5, то можно, как вариант, ввести a1=3, d=5, sum a1 + d(n-1), n=1..10
Если нужно вычислить сумму первых 7 членов геометрической прогрессии , у которой первый член b 1 = 3, разность q = 5, то можно, как вариант, ввести b1=3, q=5, sum b1*q^(n-1), n=1..7
8. Нахождение производной.
Пример . Чтобы найти производную функции f (x ) =x 2 + 3x — 4, нужно ввести derivative x^2 + 3x — 4
9. Нахождение неопределенного интеграла.
Пример . Чтобы найти первообразную функции f (x ) =x 2 + 3x — 4, нужно ввести integrate x^2 + 3x — 4
10. Вычисление определенного интеграла.
Пример . Чтобы вычислить интеграл функции f (x ) =x 2 + 3x — 4 на отрезке ,
нужно ввести integrate x^2 + 3x — 4, x=5..7
11. Вычисление пределов.
Пример . Чтобы убедиться, что
введите lim (x -> 0) (sin x)/x и посмотрите ответ. Если нужно вычислить какой-то предел при x , стремящемся к бесконечности, следует вводить x -> inf.
12. Исследование функции и построение графика.
Пример . Чтобы исследовать функцию x 3 — 3x 2 и построить ее график, просто введите x^3-3x^2. Вы получите корни (точки пересечения с осью ОХ ), производную, график, неопределенный интеграл, экстремумы.
13. Нахождение наибольшего и наименьшего значений функции на отрезке.
Пример . Чтобы найти минимальное значение функции x 3 — 3x 2 на отрезке ,
нужно ввести minimize (x^3-x^2),
Чтобы найти максимальное значение функции x 3 — 3x 2 на отрезке ,
нужно ввести maximize (x^3-x^2),
Краткий список обзначений и операторов WolframAlpha для решения задач онлайн
систем уравнений и неравенств
(минимумов и максимумов)
Основные команды для Вольфрам Альфа
1. Решение уравнений, построение графиков
- Арифметические знаки плюс, минус, умножить, поделить +, — , *, / Примеры: 3*2, x*y, (a+b)/c
- Возведение в степень «x в степени а» x^a. Примеры x^a, x**a, (a+b)^2, (a+b)**2, (a+b)^(2x+1)
- Скобки. Действия в скобках ведутся первыми
- Функции.sin(x), cos(x), tan(x)=sin(x)/cos(x), cotan(x)=cos(x)/sin(x), sec(x)=1/cos(x), cosec(x)=1/sin(x)
- Функции log(x), exp(x), sinh(x), cosh(x), tanh(x), cotanh(x)
- Корень квадратный из «х» sqrt(x) или x^(1/2)
- Чтобы вычислить выражение, нужно его просто ввести. Например корень из 2 будет выглядеть как sqrt(2) или же 2^(1/2).
2. Чтобы решить уравнение, нужно просто его ввести
3. Чтобы построить график, нужно использовать команду plot
Например нарисуем с помощью Вольфрама функцию 2^(-x) cos(x). Это делается командой plot (график).
Мы получим следующую замечательную картинку
Из этой картинки уже можно судить о нулях функции (решениях уравнения), можно представлять, как ведет себя функция и т.д. Лучше набирать в формате
Чтобы построить несколько графиков на одной координатной плоскости (например для визуализации решения систем уравнений), при значении переменной x в интервале (A,B), нужно использовать команду
3. Чтобы решить уравнение «левая часть (х)=0», наберите команду «Solve уравнение=0»
или же, лучше же в формате Solve[ «левая часть уравнения» ==0, x ]
Здесь левая часть — то, что в уравнении стоит слева, а справа — нуль. Вместо «x» поставьте свою переменную (y,z, и т.д.)
Пример : Решить уравнение ax +b = d. Набиваем Solve Получаем
При этом мы нажали кнопку «показать шаги».
Чтобы решить систему уравнений надо использовать команду Solve [ , ]
Пример : решить систему уравнений 3x+4y=0, x*x-y*y=1 относительно x,y solve[ , ]
Чтобы решить уравнение в целых числах, надо использовать команду «in integers». Например: а в квадрате плюс б в квадрате равно 25 в целых числах.
4. Чтобы собрать множители из двучлена (многочлена) f, наберите factor[f]
5. Чтобы развалить произведение f на слагаемые, используйте команду expand[f]
6. Чтобы упростить выражение f[x], наберите команду Simplify]
Например упростить «е в степени догарифм х»:
Simplify[ exp[ log[x] ] ]
Wolfram Mathematica Neural Networks 1.0
Wolfram Mathematica Link for Excel 3.1.1
Классификация wolfram
Можно классифицировать данные.
Можно не просто предсказать объект, а можно сказать чему буде равно конкретное значение.
WolframScript
WolframScript может работать с файлами без локальных ядер, используя облако Wolfram Cloud. Начните с создания текстового файла, используя облачное ядро.
Создайте скрипт-файл под названием FindPath.wls, используя облачное ядро в качестве интерпретатора со следующим содержанием.
Interactive Manipulation
The single function Manipulate gives immediate access to a huge range of powerful interactive capabilities. For any expression with symbolic parameters, Manipulate automatically creates an interface for manipulating the parameters. Manipulate supports not only mouse and keyboard manipulation, but also gamepads and other devices.
Занятие 1 | Обзор систем Wolfram Mathematica и Wolfram Cloud
Одни только дети знают, что ищут. Они отдают все свои дни тряпочной кукле, и она становится им очень-очень дорога, и, если ее у них отнимут, дети плачут…
LearnPress is a WordPress
LearnPress is a WordPress complete solution for creating a Learning Management System (LMS). It can help you to create courses, lessons and quizzes.
#!/usr/local/bin/wolframscript -cloud -print -format PNG samples = ImportString[$ScriptInputString, «JSON»]; order = Last]; tour = samples[]; Show, Graphics]]
Скрипт может выполняться из командной строки, используя локальный текстовый файл в качестве ввода.
Video Background Pro now plays video backgrounds
Виртуальные доски
организация БД moodle
Bridge integrates WordPress with the Moodle LMS
Edwiser Bridge integrates WordPress with the Moodle LMS. The plugin provides an easy option to import Moodle courses to WordPress and sell them using PayPal. The plugin also allows automatic registration of WordPress users on the Moodle website along with single login credentials for both the systems.
В июле 2020 года NASA запускает экспедицию на Марс. Космический аппарат доставит на Марс электронный носитель с именами всех зарегистрированных участников экспедиции.
Регистрация участников открыта. Получите свой билет на Марс по этой ссылке .
Если этот пост решил вашу проблему или просто понравился вам, поделитесь ссылкой на него со своими друзьями в социальных сетях.
Один из этих вариантов кода нужно скопировать и вставить в код вашей веб-станицы, желательно между тегами и или же сразу после тега . По первому варианту MathJax подгружается быстрее и меньше тормозит страницу. Зато второй вариант автоматически отслеживает и подгружает свежие версии MathJax. Если вставить первый код, то его нужно будет периодически обновлять. Если вставить второй код, то страницы будут загружаться медленнее, зато вам не нужно будет постоянно следить за обновлениями MathJax.
Подключить MathJax проще всего в Blogger или WordPress: в панели управления сайтом добавьте виджет, предназначенный для вставки стороннего кода JavaScript, скопируйте в него первый или второй вариант кода загрузки, представленного выше, и разместите виджет поближе к началу шаблона (кстати, это вовсе не обязательно, поскольку скрипт MathJax загружается асинхронно). Вот и все. Теперь изучите синтаксис разметки MathML, LaTeX и ASCIIMathML, и вы готовы вставлять математические формулы на веб-страницы своего сайта.
Очередной канун Нового Года. морозная погода и снежинки на оконном стекле. Все это побудило меня вновь написать о. фракталах, и о том, что знает об этом Вольфрам Альфа. По этому поводу есть интересная статья , в которой имеются примеры двумерных фрактальных структур. Здесь же мы рассмотрим более сложные примеры трехмерных фракталов.
Фрактал можно наглядно представить (описать), как геометрическую фигуру или тело (имея ввиду, что и то и другое есть множество, в данном случае, множество точек), детали которой имеют такую же форму, как и сама исходная фигура. То есть, это самоподобная структура, рассматривая детали которой при увеличении, мы будем видеть ту же самую форму, что и без увеличения. Тогда как в случае обычной геометрической фигуры (не фрактала), при увеличении мы увидим детали, которые имеют более простую форму, чем сама исходная фигура. Например, при достаточно большом увеличении часть эллипса выглядит, как отрезок прямой. С фракталами такого не происходит: при любом их увеличении мы снова увидим ту же самую сложную форму, которая с каждым увеличением будет повторяться снова и снова.
Бенуа Мандельброт (Benoit Mandelbrot), основоположник науки о фракталах, в своей статье Фракталы и искусство во имя науки написал: «Фракталы — это геометрические формы, которые в равной степени сложны в своих деталях, как и в своей общей форме. То есть, если часть фрактала будет увеличена до размера целого, она будет выглядеть, как целое, или в точности, или, возможно, с небольшой деформацией».
| + | сложение |
| — | вычитание |
| * | умножение |
| / | деление |
| ^ | возведение в степень |
| solve | решение уравнений, неравенств, систем уравнений и неравенств |
| expand | раскрытие скобок |
| factor | разложение на множители |
| sum | вычисление суммы членов последовательности |
| derivative | дифференцирование (производная) |
| integrate | интеграл |
| lim | предел |
| inf | бесконечность |
| plot | построить график функции |
| log (a , b ) | логарифм по основанию a числа b |
| sin, cos, tg, ctg | синус, косинус, тангенс, котангенс |
| sqrt | корень квадратный |
| pi | число «пи» (3,1415926535. ) |
| e | число «е» (2,718281. ) |
| i | Мнимая единица i |
| minimize, maximize |
Нахождение экстремумов функции (минимумов и максимумов) |
Примеры решения задач онлайн с помощью WolframAlpha
1. Решение рациональных, дробно-рациональных уравнений любой степени, показательных, логарифмических, тригонометрических уравнений.
Пример 1 . Чтобы решить уравнение x 2 + 3 x — 4 = 0, нужно ввести solve x^2+3x-4=0
Пример 2. Чтобы решить уравнение log 3 2x = 2 , нужно ввести solve log(3, 2x)=2
Пример 3. Чтобы решить уравнение 25 x -1 = 0.2 , нужно ввести solve 25^(x-1)=0.2
Пример 4. Чтобы решить уравнение sin x = 0.5 , нужно ввести solve sin(x)=0.5
2. Решение систем уравнений.
Пример . Чтобы решить систему уравнений
x + y = 5,
x — y = 1,
нужно ввести solve x+y=5 && x-y=1
Знаки &&
3. Решение рациональных неравенств любой степени.
Пример . Чтобы решить неравенство x 2 + 3 x — 4 solve x^2+3x-4
4. Решение систем рациональных неравенств.
Пример. Чтобы решить систему неравенств
x 2 + 3 x — 4 0,
нужно ввести solve x^2+3x-4 && 2х^2 — x + 8 > 0
Знаки && в данном случае обозначает логическое «И».
5. Раскрытие скобок + приведение подобных в выражении.
Пример . Чтобы раскрыть скобки в выражении (c+d ) 2 (a-c ) и привести подобные, нужно
ввести expand (c+d)^2*(a-c) .
6. Разложение выражения на множители.
Пример . Чтобы разложить на множители выражение x 2 + 3 x — 4, нужно ввести factor x^2 + 3x — 4 .
7. Вычисление суммы n первых членов последовательности (в том числе арифметической и геометрической прогрессий).
Пример . Чтобы вычислить сумму 20 первых членов последовательности, заданной формулой a n = n 3 +n , нужно ввести sum n^3+n, n=1..20
Если нужно вычислить сумму первых 10 членов арифметической прогрессии , у которой первый член a 1 = 3, разность d a1=3, d=5, sum a1 + d(n-1), n=1..10
Если нужно вычислить сумму первых 7 членов геометрической прогрессии , у которой первый член b 1 = 3, разность q = 5, то можно, как вариант, ввести b1=3, q=5, sum b1*q^(n-1), n=1..7
8. Нахожд ение производной.
Пример . Чтобы найти производную функции f (x ) = x 2 + 3 x — 4, нужно ввести derivative x^2 + 3x — 4
9. Нахожд ение неопределенного интеграла.
Пример . Чтобы найти первообразную функции f (x ) = x 2 + 3 x — 4, нужно ввести integrate x^2 + 3x — 4
10. Вычисление определенного интеграла.
Пример . Чтобы вычислить интеграл функции f (x ) = x 2 + 3 x — 4 на отрезке ,
нужно ввести integrate x^2 + 3x — 4, x=5..7
11. Вычисление пределов.
Пример . Чтобы убедиться, что
введите lim (x -> 0) (sin x)/x и посмотрите ответ. Если нужно вычислить какой-то предел при x , стремящемся к бесконечности, следует вводить x -> inf .
12. Исследование функции и построение графика .
Пример . Чтобы исследовать функцию x 3 — 3 x 2 и построить ее график, просто введите x^3-3x^2 . Вы получите корни (точки пересечения с осью ОХ ), производную, график, неопределенный интеграл, экстремумы.
13. Нахождение наибольшего и наименьшего значений функции на отрезке .
Пример . Чтобы найти минимальное значение функции x 3 — 3 x 2 на отрезке ,
нужно ввести minimize (x^3-x^2),
Чтобы найти максимальное значение функции x 3 — 3 x 2 на отрезке ,
нужно ввести maximize (x^3-x^2),
Вольфрам построение графиков – Как построить график функции в Wolfram|Alpha

В двух предыдущих примерах мы задавали область значений аргумента х. А что будет, если не задавать область значений х?

Одной из уникальных особенностей Wolfram | Alpha является автоматический выбор подходящего диапазона х для построения графиков функций одной и двух переменных, например, как при построении графика этой функции, содержащей функции Бесселя:

Обращаясь к Wolfram | Alpha, чтобы построить график функции, мы всегда используем префикс plot. Если же мы введем какое-либо одномерное выражение без префикса plot, то получим кроме графика функции в прямоугольных декартовых координатах, еще и много других сведений об этой функции.

Кроме того, изображение построенного графика будет крупнее, если вы используете префикс plot.
Одновременно в Wolfram | Alpha можно строить графики нескольких функций.
Если навести мышь на левый нижний угол изображения, то становятся доступными две ссылки: Save as image и Copyable planetext. Рассмотрим такой график:
Первая ссылка Save as image, которая открывается в левом нижнем углу изображения, позволяет сохранить построенный график, как картинку на компьютере пользователя — при нажатии на Save as image автоматически начнется загрузка изображения:
Вторая ссылка Copyable planetext позволяет увидеть код, аналогичный тому, который используется системой Matematica для построения графиков:
Теперь рассмотрим, как в Wolfram | Alpha построить графики функций двух переменных. Начнем с функции y^2 cos(x) для x от -6 до 6 и y от -2 до 2
Как и в одномерном случае, Wolfram | Alpha автоматически определяет подходящий диапазон значений аргументов, где функция имеет наиболее характерный вид. В случае, если Wolfram | Alpha не может найти подходящий диапазон, то это скорее всего потому, что система не смогла определить такой диапазон, где функция имеет наиболее интересное поведение. В этом случае, мы можем задать диапазон вручную, как это было сделано выше. Посмотрите следующие примеры:
А что, если вы захотите построить одновременно несколько графиков функций двух переменных?
Wolfram | Alpha строит отдельный график для каждой функции в списке. Вот еще несколько примеров:
Новой функцией Wolfram | Alpha является возможность строить графики действительной и мнимой частей комплексно-значных функций двух переменных:
Во всех рассмотренных выше примерах Wolfram | Alpha строил также и контурные графики (линии уровня) в дополнение к трехмерным графикам (поверхностям). Чтобы увидеть связь между трехмерными и контурными графиками, нужно нажать кнопку “Show contour lines”. Отметим, что и трехмерные и контурные графики используют один и тот же диапазон аргументов.
Все трехмерные графики строятся с помощью функции plot3d системы Mathematica. Контурные графики были сделаны с помощью ContourPlot. В обоих случаях, чтобы увидеть код системы Mathematica для генерации изображения нужно нажать ссылку Copyable planetext в левом нижнем углу нужного изображения.
Источник by Sam Blake
Опубликовано в блоге Web in Math
Web in Math: Как строить графики функций в Wolfram
Если заменить 7 на (-7), то получим графики действительной и мнимой частей функции: plot sin(sqrt(-7)x)+19cos(x) для x от -5 до 5
В двух предыдущих примерах мы задавали область значений аргумента х. А что будет, если мы не будем задавать область значений х?
Одной из уникальных особенностей Wolfram | Alpha является автоматический выбор подходящего диапазона х для построения графиков функций одной и двух переменных, например, как при построении графика этой функции, содержащей функции Бесселя:
Обращаясь к Wolfram | Alpha, чтобы построить график функции, мы всегда используем префикс plot. Если же мы введем какое-либо одномерное выражение без префикса plot, то получим кроме графика функции в прямоугольных декартовых координатах, еще и много других сведений об этой функции.
Кроме того, изображение построенного графика будет крупнее, если вы используете префикс plot.
Одновременно в Wolfram | Alpha можно строить графики нескольких функций.
Если навести мышь на левый нижний угол изображения, то становятся доступными две ссылки: Save as image и Copyable planetext. Рассмотрим такой график:
Первая ссылка Save as image, которая открывается в левом нижнем углу изображения, позволяет сохранить построенный график, как картинку на компьютере пользователя — при нажатии на Save as image автоматически начнется загрузка изображения:
Вторая ссылка Copyable planetext позволяет увидеть код, аналогичный тому, который используется системой Matematica для построения графиков:
Теперь рассмотрим, как в Wolfram | Alpha построить графики функций двух переменных. Начнем с функции y^2 cos(x) для x от -6 до 6 и y от -2 до 2
Как и в одномерном случае, Wolfram | Alpha автоматически определяет подходящий диапазон значений аргументов, где функция имеет наиболее характерный вид. В случае, если Wolfram | Alpha не может найти подходящий диапазон, то это скорее всего потому, что система не смогла определить такой диапазон, где функция имеет наиболее интересное поведение. В этом случае, мы можем задать диапазон вручную, как это было сделано выше. Посмотрите следующие примеры:
А что, если вы захотите построить одновременно несколько графиков функций двух переменных?
Wolfram | Alpha строит отдельный график для каждой функции в списке. Вот еще несколько примеров:
Новой функцией Wolfram | Alpha является возможность строить графики действительной и мнимой частей комплексно-значных функций двух переменных:
Во всех рассмотренных выше примерах Wolfram | Alpha строил также и контурные графики (линии уровня) в дополнение к трехмерным графикам (поверхностям). Чтобы увидеть связь между трехмерными и контурными графиками, нужно нажать кнопку “Show contour lines”. Отметим, что и трехмерные и контурные графики используют один и тот же диапазон аргументов.
Все трехмерные графики строятся с помощью функции plot3d системы Mathematica. Контурные графики были сделаны с помощью ContourPlot. В обоих случаях, чтобы увидеть код системы Mathematica для генерации изображения нужно нажать ссылку Copyable planetext в левом нижнем углу нужного изображения.
Источник by Sam Blake
Больше информации по использованию Wolfram|Alpha вы найдете в блоге
Как построить график функции f(x) по результатам проведенного исследования
В серии постов, посвященной реализации общей схемы исследования функции одной переменной с применением Wolfram | Alpha, мы последовательно прошли целый ряд этапов, действуя так, как если бы мы проводили исследование функции «вручную». Wolfram | Alpha при этом мы использовали, как вспомогательный инструмент — своего рода калькулятор на все случаи жизни. Это позволило нам в значительной степени отвлечься от рутинных вычислений и сосредоточиться собственно на исследовании функции. Без Wolfram | Alpha некоторая часть необходимых вычислений оказалась бы слишком трудоемкой для ручных расчетов, и исследование данной функции показалось бы нам слишком сложной задачей.
Именно это соображение — возможность, невзирая на объемность и трудоемкость рутинных вычислений исследовать любые функции, — главный резон в пользу использования Wolfram | Alpha при решении подобного рода задач. Фактически, без ограничения общности решается прежде всего методическое задание — изучить и научиться применять на практике общую схему исследования функции.
Однако, на практике, при решении прикладных задач, навряд ли кто-либо станет идти таким сложным и запутанным путем, если только имеются иные возможности. А они имеются. По ходу решения, эти возможности я систематически рассматривал, и пытался акцентировать на них ваше внимание: это специфические запросы Wolfram | Alpha, которые позволяют » в один клик» по мере надобности находить все отдельные свойства и характерные точки функции. Подробное изложение «практического» подхода к исследованию функции с помощью Wolfram | Alpha, в отличие от «теоретического», которому мы следовали все это время, будет представлено в одном из следующих постов.
Однако, вернемся к заключительному этапу классической общей схемы исследования функции. Это четвертый этап в общей схеме исследования функции. Цель этого этапа — построить по результатам проведенного выше исследования график функции:
Основные задания четвертого этапа состоят в следующем: используя результаты предыдущего исследования построить график функции f(x). Для этого нам понадобятся результаты всех предыдущих этапов исследования функции.
16.1. Начертить систему координат, учитывая найденные ранее область определения данной функции (см. также: область определения функции в Wolfram | Alpha) и множество значений данной функции (см. также: множество значений функции в Wolfram | Alpha). Эти сведения на данном этапе нужны, чтобы начертить систему координат так, чтобы график функции расположился в ней крупным масштабом и по центру, а не как «очень одинокий петух» в поучительной детской книжке про Карлсона, который живет на крыше
16.2. Обозначить на оси абсцисс точки разрыва функции. Сведения о точках разрыва были получены при исследовании области определения данной функции.
16.3. Обозначить точки пересечения графика функции с осью абсцисс и точки пересечения с осью ординат.
16.4. Начертить вертикальные, горизонтальные и наклонные асимптоты.
16.5. Обозначить на чертеже с помощью условных обозначений характер поведения функции возле вертикальных асимптот (см. также: изучение разрывных функций).
16.6. Обозначить точки пересечения графика функции с ее асимптотами.
16.7. Обозначить на чертеже точки экстремума функции, угловые точки графика функции (если они есть).
16.8. Обозначить на чертеже точки перегиба графика функции.
16.9. Начертить график функции с учетом всех обозначений и точек, нанесенных на чертеж. Я не стал здесь этого делать — просто поленился делать это вручную (рисовать график на бумаге, а потом фотографировать или сканировать…). Тем более, что в следующем пункте мы уже получим этот график с помощью Wolfram|Alpha.
17. Проверить визуально правильность построения графика функции, используется запрос: plot f(x) x=a..b, где [a, b] отрезок, который содержит все характерные точки функции, найденные ранее:

Или запрос asymptotes f(x), который здесь, как и во многих других случаях, выводит более наглядный результат:

18. Осталось, пользуясь полученным графиком функции, проанализировать геометрические свойства построенного графика (симметрия относительно оси ординат и начала отсчета системы координат и др.) и сформулировать выводы относительно свойств четности-нечетности и периодичности данной функции f(x). Эту часть оставляю вам на самостоятельную проработку.
P.S.
Как я обещал в начале этого поста, в одном из следующих постов будет представлено подробное изложение «практического» подхода к исследованию функции с помощью Wolfram | Alpha, в отличие от «теоретического», которому мы следовали все это время.
Иллюстрированный самоучитель по Mathematica 3/4 › Графика и звук › Двумерная графика. Графическая функция Plot. [страница — 180] | Самоучители по математическим пакетам
Двумерная графика. Графическая функция Plot.
Графика, как важнейшее средство визуализации вычислений, всегда была козырной картой системы Mathematica и во многом способствовала ее высокой репутации как мирового лидера среди систем компьютерной математики. Обширные графические возможности достигаются при небольшом числе встроенных функций графики за счет их модификации с помощью опций и директив. Благодаря этому Mathematica позволяет строить практически любые виды графиков. Для просмотра и изменения опций графика можно (выделив ячейку с графиком) воспользоваться описанным ранее инспектором опций, в котором есть соответствующий раздел. Однако в этом уроке мы инспектором опций пользоваться не будем – все необходимые опции будут вводиться в соответствующие функции так, как это принято делать при программировании задач графики.
Концептуально графики в системе Mathematica являются графическими объектами, которые создаются (возвращаются) соответствующими графическими функциями. Их немного, около десятка, и они охватывают построение практически всех типов математических графиков. Как уже отмечалось, достигается это за счет применения опций и директив.
Поскольку графики являются объектами, то они могут быть значениями переменных. Поэтому Mathematica допускает следующие конструкции:
- Plot[Sin[x], ] – построение графика синусоиды;
- g: = Plot [Sin [x], ] – задание объекта – графика синусоиды – с отложенным выводом;
- g=Plot [Sin [x], ] – задание объекта – графика синусоиды – с немедленным выводом.
Начнем рассмотрение графических возможностей системы с построения простейших графиков функций одной переменной вида у =f(x) или просто f(x). График таких функций строится на плоскости, то есть в двумерном пространстве. При этом используется прямоугольная (декартова) система координат. График представляет собой геометрическое положение точек (х, у) при изменении независимой переменной (абсциссы) в заданных пределах, например от минимального значения xmin до максимального хтах с шагом dx. По умолчанию строятся и линии координатной системы.
Для построения двумерных графиков функций вида f(x) используется встроенная в ядро функция Plot:
- Plot [f, ] – возвращает объект, представляющий собой график функции f аргумента х в интервале от xmin до xmax;
- Plot[ , ] – возвращает объект в виде графиков ряда функций fi.
Функция Plot используется для построения одной или нескольких линий, дающих графическое представление для указанных функций f, f1, f2 и т. д. На рис. 8.1 показано построение графика функции sin(x)/x без использования каких-либо опций (точнее, с набором опций по умолчанию).

Рис. 8.1. Построение двумерного графика
Тут виден как раз тот случай, когда масштаб графика по вертикали выбран системой неудачно – часть графика сверху просто отсекается. В большинстве же случаев применение функции Plot позволяет получить вполне «удобоваримый» график.
Оцифровка и аппроксимация графиков функций при помощи Wolfram Mathematica и Graph Digitizer / Habr
В процессе выполнения лабораторных практикумов по физике перед мной часто встает задача определить значение функции по её графику представленному на бумаге, для выполнения дальнейших расчётов. Так как обработка подобных графиков на компьютере значительно повышает скорость и точность этого процесса, то было решено изучить возможности для оцифровки графика и построения математической модели кривой, представленной на графике.

В качестве примера, я взял график зависимости КПД генератора от его мощности из лабораторного практикума по электротехнике. Входе выполнения работы мной было выполнено сканирование графика, обработка изображения графика, оцифровка координат и построение математической модели кривой.
1. Подготовка изображения
Обработку изображений я рекомендую программу Adobe Photoshop. При помощи инструмента Curves добиваемся полноценного контраста, далее при помощи фильтра Smart Sharpen повышаем резкость. Несомненным плюсом Photoshop является возможность обработки большого количества изображений путем записи экшена (Action) и применения его совместно с пакетной обработкой (File – batch processing).
Для большего ускорения процесса обработку можно производить в программе сканирования при помощи заранее заготовленных пресетов или автоматических алгоритмов.

Рисунок 1.1 – Изображение графика До обработки и После обработки
2. Оцифровка координат

Рисунок 2.1 – Стандартный интерфейс Graph Digitize
2.1. Установка системы координат (СК)

Рисунок 2.2 – Вид с установленной системой координат и сеткой
2.3. Оцифровка кривой
По моему опыту большее количество точек необходимо устанавливать в окрестности точек перегиба кривой, на линейных участках кривой можно ограничится небольшим их количеством.
Если на графике присутствует больше чем 1 кривая или семейство кривых, то после установки точек на первой нужно добавить новую линию «Команды – Добавить линию». После чего можно будет выставить точки на второй кривой и т.д.
Если на изображении графика нет сетки, то можно воспользоваться автоматическим алгоритмом трассировки кривой (Ctrl + T). При наличии сетки алгоритм выдает много ошибок.

Рисунок 2.3 – Вид с установленными точками на кривой
2.4. Экспорт данных
Линия #1
0.00000000000000 0.00000000000000
2.36249828804472 0.0100017499987319
4.64890967470313 0.0144478880812405
9.19129768746544 0.0211179194797685
9.25216720857449 0.0255624090127471
13.8097726016141 0.0333435627945197
18.3369432340991 0.0389024718098030
В меню «Установки – Параметры» устанавливается формат вывода данных. Там же можно включить сортировку точек по значению координаты X, если на вашей кривой для каждого X существует уникальный Y, для исключения случайных ошибок в последовательности установке точек.

Рисунок 2.4 – Установки экспорта
3. Построение математической модели кривой
Для быстрого импорта данных в Wolfram Mathematica скопируем координаты точек из экспортированного файла и вставим в пустую ячейку Excel. В итоге на листе появятся 2 колонки данных X и Y соответственно.

Рисунок 3.1 – Данные в Excel
Следующим шагом создаем новый документ Wolfram Mathematica и перетягиваем в него файл Excel. В итоге образуется список списков, содержащий координаты точек. Присвоим ему переменную data.

Рисунок 3.2 – Импортированные данные в Wolfram Mathematica
Отобразим импортированные данные при помощи функции ListPlot[].

Рисунок 3.3 – Графическое отображение точек в виде диаграммы разброса данных
Аппроксимируем точки полиномом 5й степени. Для этого используем функцию LinearModelFit[]. В итоге мы получим объект класса FittedModel[]. Присвоим ему переменную fit.
Вычислим коэффициент детерминации R^2, показывающий какую долю вариации (разброса) переменной, объясняет полученное уравнение. Чем ближе данный коэффициент к единице, тем большую долю вариации объясняет уравнение. Для этого в качестве аргумента функции fit укажем «RSquared». В данном случае R^2 = 0.99, это значит, что наша модель объясняет 99,9% вариации переменной.
Для вычисления значения Y необходимо в качестве аргумента к функции fit указать требуемое значение X.

Рисунок 3.4 – Аппроксимация точек, вычисление коэффициента детерминации и вычисление значения функции
Кроме вычисления коэффициента детерминации, проведем регрессионный анализ. В этот раз в качестве аргумента функции fit укажем «ANOVATable». По полученному результату, можно утверждать, что оправданно использование каждого члена аппроксимирующего полинома. Отобразим полученное уравнение в явном виде, для этого к переменной fit применим функцию Normal[].

Рисунок 3.5 – Регрессионный анализ и полином в явном виде
Далее построим график полинома и отобразим на нем исходные точки. При помощи стандартного синтаксиса настроим стиль графика добавим подписи к осям и название графика.

Рисунок 3.6 – Итоговый график

Рисунок 3.7 – Сравнение итогового графика с исходными данными
Возможности для анализа математической модели в Wolfram Mathematica воистину огромны, но мы ограничимся представленными выше. Интересующиеся могут узнать больше путем вычисления функции fit[«Properties»].
В итоге мы изучили возможности применения Wolfram Mathematica и Graph Digitizer для оцифровки графиков и подбора математической модели кривой. Использованное программное обеспечение позволяет выполнить поставленную задачу с минимальными усилиями и с высоким качеством.
P.S: В комментариях вкратце можете рассказать часто ли Вам приходится сталкиваться с подобной задачей в вашей деятельности? Буду рад ответить на вопросы.
Wolfram mathematica как пользоваться, вольфрам альфа построить график онлайн
После непосредственного проведения КР эксперимента необходимо извлечь информацию из полученных данных не только качественно, но также и количественно. Для этого обычно применяются такие программные пакеты как PeakFit, Origin и другие. Один из них Wolfram Mathematica.
Преимущество этого программного пакета заключается в именно пакетной обработке данных, то есть в возможности обрабатывать последовательно, с помощью одного заданного начального условия, сразу большое количество файлов с данными эксперимента при разных внешних параметрах (температуре, давлении).
Для удобства и точности подгонки, полученные подогнанные данные одного спектра одновременно являются начальными для следующего.
Для удобства и исключения каких либо неясностей при пакетной обработке спектров, в программе из имени файла считывается внешний параметр (температура, давление). Оно должно быть специфично — содержать в себе температуру в кельвинах, при которой был проведен данный эксперимент. Само имя файла следует разбить на несколько частей, например с помощью символа «_».
Пример текста программы, написанной в Wolfram Mathematica, для обработки данных КР :
При обработке спектров важную роль играет выбор модели для подгонки контуров. Ниже представлен фрагмент программы, где описывается одиннадцать функций подгонки, и два коэффициента Бозе – Эйнштейна (nbes, nbeas — для стоксовой и антистоксовой компоненты):

*При использовании в вычислениях физических констант нет необходимости вводить их численное значение. Достаточно в начале программы подключить пакет Physical Constants используя следующую запись:
Самой распространенной и используемой во многих работах, ввиду универсальности, является модель Лоренца.
Wolfram Alpha: вычислитель ответов
Однако при описании низкочастотного диапазона спектра рекомендуется пользоваться функцией подгонки Harmonic (функция затухающего гармонического осциллятора). Кроме того, при работе с функцией Harmonic нет необходимости отдельно учитывать температурный фактор Бозе – Эйнштейна, ввиду того, что он является одним из составляющих этой функции. Ниже мы опишем два примера программы с использованием моделей для подгонки Harmonic и Lorentz:
1. Пример текста программы с использованием модели подгонки спектров Harmonic:
Полный текст программы:

Описание работы программы по шагам:
Задаем (MyPath) и выбираем(SetDirectory) директорию, в которой хранится папка с нужными нам файлами с экспериментальными данными
Выбираем тип и расширение файлов (*.txt)
Формируем форму вывода в файл
Здесь задаем модель для подгонки. Условие If присутствует вследствие того, что для функции Harmonic существует два варианта (для стоксовой и антистоксовой компоненты)
Задаем начальные данные для подгонки первого спектра
i1, v1,w1 – интенсивность, частота и ширина первой линии соответственно
i2, v2,w2 – интенсивность, частота и ширина второй линии соответственно
c, b – параметры базовой линии (наклон и уровень по оси Oy).
Значения Sfrom, Sto, Szero определяют
Sfrom и Sto – вырезают частотный интервал для подгонки (в данном случае это 0 – 130 cm -1 )
Szero – значение на оси ординат, на котором закреплена ось абсцисс.
Далее следует цикл Do, перебирающий по одному файлу iName из указанной папки за один шаг. Выводится название файла
В данном случае в цикле участвуют файлы с 1 по 100.
В этой строке происходит разбор имени файла на элементы (с помощью двух функций ToExpression и StringSplit) и считывание значения переменной T (температура, давление) из имени файла (iName). Стоит отметить, что имя файла должно быть специфично — содержать в себе температуру в кельвинах, при которой был проведен данный эксперимент. Само имя файла следует разбить на несколько частей, например с помощью символа «_».
Вывод значения T.
Считывание данных из выбранного файла с помощью функции ReadList и присвоение им имени FullData.
Выбираем нужный нам диапазон данных с помощью функции Select и присваиваем ему имя Data.

Функция FindFit является базовой функцией подгонки в Wolfram Mathematica. Максимальное число итераций – 5000.
*Здесь и далее символ /. означает подстановку значений, указанных после этого знака в выражение, стоящее до знака.

Вывод на экран исходных данных (Epilog-> Point [Data]) функцией Plot, полученных линий в отдельности (условие If[]), подогнанного спектра (model/.fit)
AxesOrigin – интервал значений по оси Ox
PlotRange – интервал значений по оси Oy
PlotStyle – совокупность параметров графика
Axes->True – видимость осей
Thickness – толщина линий
AxesLabel – подписи по осям.
Выделение подогнанных значений по точкам (функция Evaluate), соответственно данным из файла (iName).
Вычисляем разницу между подогнанными значениями и экспериментальными данными.
Вывод на экран значения Diff – погрешности подгонки (функция ListLinePlot)
PlotRange – интервал значений по оси Ox
AxesOrigin – точка пересечения осей
FillingAxis – заполнение цветом области под графиком.
Присвоение массиву подогнанных значений имени tmp.
Дополнение массива ResultData массивом tmp на каждом шаге цикла (функция Append).
Вывод на экран массива значений tmp.
Окончание работы цикла.
Вывод на экран полученных значений в табличной форме с помощью функции TableForm.
2. Пример текста программы с использованием модели подгонки спектров Lorentz:
Программа, описанная в данном параграфе, по своей структуре практически полностью соответствует программе, описанной ранее, за исключением модели подгонки.
Вследствие того, что при использовании модели подгонки Lorentz нужно отдельно учитывать температурный фактор Бозе — Эйнштейна, в тексте программы появился новый фрагмент.
Задается массив чисел с именем BoseFactor. Он заполняется нулями, имеет два столбца и колличество строк такое же, как и у массива FullData.
Задается массив элементов Eva1, который является фактором Бозе — Эйнштейна для стоксовой компоненты спектра (вычисляется для каждой точки массива FullData (массив экспериментальных данных)). Запись x-> FullData [[1; ;,1]] означает, что в выражении Eva1 переменная x принимает все значения первого столбца массива элементов FullData.
Вычисляется массив с именем Diff1с помощью массива Eva1 (фактора Бозе — Эйнштейна). Данная запись означает, что второй столбец массива FullData поэлементно делится на массив факторов Бозе — Эйнштейна.
— присвоение значений каждому столбцу массива BoseFactor. первый столбец равенпервому стобцу массива экспериментальных данных Fulldata. Второму столбцу присваивается значение Diff1. Diff1 имеет смысл интенсивности в каждой точке экспериментального спектра, домноженную на обратный температурный фактор Бозе — Эйнштейна.
— выбор интересующего нас спектрального диапазона с помощью функции Select. Аналогичная строка присутствует и в тексте программы, представленной в П.1, но исходным массивом там служит массив экспериментальных данных FullData.
Программа, описанная в данном разделе
Изучение разрывных функций с помощью Wolfram|Alpha
Wolfram|Alpha может находить и анализировать точки разрыва функций действительного аргумента. Для этого служит специальный запрос discontinuities.
Кроме поиска разрывов, по запросу discontinuities Wolfram|Alpha будет пытаться вычислить левые и правые пределы в каждой разрыва, а также значение функции в точке разрыва, если оно существует. Чтобы получить эту информацию, нужно нажать кнопку «Show limits».

Как известно, существует три основных типа точек разрыва функций действительного аргумента. Первый тип — это «бесконечный» разрыв, который имеет место в точке, где функция возрастает до бесконечности и/или убывает до минус бесконечности. В точках бесконечного разрыва функция имеет вертикальную асимптоту. Типичный примером может служить функция 1/(х:-1)

Аналогичный результат можно получить и для более сложной функции:
Второй тип разрывов функций — это конечный неустранимый разрыв. Левый и правый пределы функции в точке конечного неустранимого разрыва существуют (конечны), но не равны между собой. Так, что функция в точке разрыва испытывает «скачок», величина которого равна разности правого и левого пределов функции в точке разрыва. Примером может служить ступенчатая функция Хевисайда, которая находит широкое применение в радиотехнике. В точке х=0 значение функции Хевисайда скачком изменяется на 1:

Комбинация двух предыдущих типов разрывов — точка бесконечного разрыва, в которой один односторонний предел конечный, а другой — бесконечный:

Последний тип разрыва называется «устранимым» разрывом. Это когда в левый и правый пределы в точке разрыва существуют (конечны) и равны между собой, но не равны значению функции в точке разрыва. Простой пример — функция (х — 1)/(х — 1), которая равна 1 всюду, за исключением точки х = 1, где она не определена:

Еще один пример функции, которая имеет устранимый разрыв в точке х=1:

Еще один стандартный пример устранимого разрыва:

Представляет также интерес изучение непрерывности функции sin(1/x), которая имеет в точке х=0 разрыв, который является сложным для классификации. Обратите внимание, что эта функция не определена в точке 0, а кроме того левый и правый пределы функции в точке 0 не существуют, хотя и не являются бесконечными. Неудивительно, что Wolfram|Alpha не выдает никакого заключения относительно классификации данного разрыва:

Функция, заданная параметрически имеет разрывы в тех точках, где терпит разрыв хотя бы один из ее компонентов:


Отыскание точек разрыва функций комплексного переменного является более сложной задачей. В настоящее время Wolfram|Alpha успешно определяет полюсы. Этот вопрос уже рассматривался в посте Ряды Лорана в Wolfram|Alpha или Кто читает Wolfram|Alpha по-русски. Здесь приведу лишь один пример, сравните:
Как видим, запрос discontinuities, который предназначен для исследования разрывности функций действительного переменного, дает ответ, что данная функция непрерывна.
Напротив, другой запрос — poles — предназначенный для нахождения полюсов функций комплексного переменного, находит не только полюсы данной функции, но и соответствующие им вычеты:
Таким образом, для исследования разрывов функции действительного аргумента в Wolfram|Alpha следует использовать запрос discontinuities.
Похожие публикации:
- Как из mathcad файла сделать pdf
- Как импортировать в maple картинку
- Как можно зарегистрироваться на wechat без помощи
- Как найти контакт в wechat
Как подписать график в wolfram mathematica
Визуализация простого набора данных
Андрей Зеленица,
z-andr@ukr.net
Общее количество использованных в посте встроенных функций или символов: 53
Постановка задачи
“Нужен график, где в системе координат показано, что например для киевской области точка на системе координат найдена, где пересекается его объем кредитования (ось у) и объем валовой продукции (ось х) и точка эта подписана, что это Киевская область. подписаны также оси координат.”
На данном простом примере мы попробуем показать основные приемы визуализации данных в Mathematica . При этом мы постараемся подробно объяснить почему и как используются те или иные функции, опции и приемы, постаравшись ответить на большинство вопросов, которые возникают у начинающих пользователей.
Предлагаемый материал разбит на несколько отдельных частей.
Импорт данных
Обрабатываем данные
График с ListPlot
Tooltip — обманчивая простота
От графиков — к диаграммам
Диаграмма BarChart
Диаграмма BarChart3D
Парная диаграмма PairedBarChart
Круговая диаграмма PieChart
Секторная диаграмма SectorChart3D
Прямоугольная диаграмма RectangleChart3D
Что дальше?
Пользователю предлагается знакомиться с содержанием, последовательно вычисляя при этом каждую ячейку ввода.
Импорт данных
Импортируем данные для отображения.
Для этого, нам нужно указать название того файла, который требуется импортировать. А чтобы не мучиться с вводом полного пути к файлу, что иногда требуется, если он лежит в папке, которая не просматривается Mathematica по умолчанию, или если существуют несколько одноименных файлов, находящихся в разных папках, проделаем следующее:
Введем: Import[]
Поставим курсор внутри квадратных скобок
Откроем меню Insert > File Path… > в появившемся окне найдем требуемый файл и щелкнем на кнопке Открыть .
Полное название файла будет вставлено в качестве аргумента функции Import .
Нажмем Shift+Enter , и содержимое файла будет импортировано.
Содержимое файлов типа *.xls импортируется в виде списков. Если файл содержит много информации, причем на разных листах, то получится достаточно большой вложенный список. Листы при этом будут подсписками первого уровня, внутри которых будет содержаться информация для каждого листа в отдельности.
Чтобы указать лист, который нужно импортировать, обычно используется функция Part .
Для нашего файла это будет выглядеть следующим образом:
Обрабатываем данные
Так как данные были только в 1-ом листе, остальные листы Mathematica не импортировала. Но при этом, вся информация была заключена в “общие” скобки. Если бы были еще листы с данными, то пришлось бы удалять ненужные подсписки, а в данном случае нужно удалить одни лишние “общие” скобки.
Удаляем заголовки (первый подсписок), так как они только мешают при расчетах. При необходимости использования их в качестве подписей графика, мы всегда сможем их “выудить” в дальнейшем. Кроме того, нужно удалить последний подсписок, так как он “пустой”.
Обратите внимание, что элементы списка второго аргумента функции Delete заключены в фигурные скобки, которые на первый взгляд могут показаться лишними. Однако, без них будет удалена лишь вторая часть первого подсписка.
График с ListPlot
Выделим в отдельные списки названия областей и координаты, по которым будут строиться точки графика.
Вспомним, что от нас требует постановка задачи:
“Нужен график, где в системе координат показано, что например для киевской области точка на системе координат найдена, где пересекается его объем кредитования (ось у) и объем валовой продукции (ось х) и точка эта подписана, что это Киевская область. подписаны также оси координат.”
Естественно, ListPlot едва ли не самым лучшим образом подходит для этого, однако, нужно еще и подписать все точки. В документации по ListPlot сказано, что за это отвечает опция PlotMarkers . Но если Вы попробуете воспользоваться конструкцией
ListPlot[координаты, PlotMarkers->названия] ,
скорее всего все точки будут подписаны первым значением из списка названий. Это происходит потому, что маркеры присваиваются спискам, а на подспискам. Чтобы превратить для Mathematica подсписки координат в списки, потребуются дополнительные фигурные скобки, которые легко добавить с помощью команды Partition .
Теперь можно строить график.
Для улучшения внешнего вида, добавим несколько опций: Filling — для отображения координатных линий, PlotRange — для более точного указания отображаемой области значений, AxesLabel — для задания подписей осей координат.
Возможно, это то, что и требовалось, но при более плотно расположенных результатах, надписи накладываются одна на одну, что ухудшает восприятие графика.
Tooltip — обманчивая простота
Когда нужно отобразить множество точек на графике, подписывать каждую точку становится неудобно: надписи накладываются друг на друга, мешая восприятию информации. Удобнее было бы иметь всплывающую подсказку при наведении указателя мыши на точку. В Mathematica это делается с помощью функции Tooltip .
Ее простой синтаксис является обманчивым. В документации дано большое количество примеров, где данные получаются из функций, и с этим проблем возникнуть не должно. Другое дело — когда нужно применить Tooltip для отображения данных из набора. Для начинающих это может стать изматывающей головоломкой.
Все дело в том, что Tooltip должен последовательно обработать точку за точкой, сопоставляя каждой соответствующее название. И применить Tooltip к списку данных просто так не получится. Нужно выражение, которое подготовит отдельные наборы:
координаты точки + маркер ,
и “скормит” полученные наборы функции Tooltip .
Синтаксис Tooltip состоит из двух элементов: выражение и маркер . Подставим на место каждого элемента функцию Pick , чей аргумент состоит из элементов [список, селектор, шаблон] . В качестве списка укажем список координат и список названий (соответственно для выражения и маркера функции Tooltip ). В качестве селектора укажем список названий, а в качестве шаблона применим слот # чистой функции ( Function ). За закрывающей скобкой функции Tooltip введем обозначение чистой функции & а затем команду /@ ( Map ) и вновь укажем список названий.
Полученная конструкция работает следующим образом:
Функция Map , имеющая альтернативную форму записи /@ , обеспечивает последовательный вызов всех элементов списка names.
Чистая функция Function , имеющая альтернативную форму записи & , обеспечивает подстановку полученных значений в свои слоты, являющиеся шаблонами функции Pick .
Функция Pick просматривает селектор (список названий names ) в поисках подставленного в слот значения и возвращает значение из основного списка (координат coord и названий names , соответственно).
Подставим пока вместо Tooltip функцию Print , чтобы посмотреть, какие данные получаются на выходе нашего выражения.
Все данные сгруппированы в отдельные наборы, и при этом они не объединены в общий список! Именно для этого мы создавали наше выражение, так как Tooltip не срабатывает для списков. Еще одну вещь нужно поправить: координаты заключены в двойные фигурные скобки, что скажется на корректной работе функции Tooltip при построении графика. Поэтому, исправим это с помощью команды Flatten .
Приведенное здесь выражение не является уникальным. Другие пользователи могут применять иные выражения для получения такого же результата. Вы сами можете попробовать создать аналогичное выражение с помощью других функций и приемов Mathematica .
Теперь можно построить график. Мы вновь воспользуемся функцией ListPlot со следующими опциями для улучшения внешнего вида: PlotMarkers — для регулировки размера точек, Filling — для отображения координатных линий, PlotRange — для более точного указания отображаемой области значений, AxesLabel — для задания подписей осей координат.
Теперь, при наведении указателя мыши на точку, высвечивается всплывающая подсказка с названием области, которой соответствует выбранная точка.
От графиков — к диаграммам
Несмотря на то, что нами был дан ответ на поставленную задачу, нельзя сказать, что наглядность отображения данных оказалась исчерпывающей. Поэтому, имеет смысл попробовать обратиться к диаграммам, которые зачастую бывают намного нагляднее графиков. К тому же, для графиков данных зачастую подходит лишь одна функция — ListPlot .
В английском языке “Диаграмма” звучит как “Chart”. Поэтому воспользуемся стандартным приемом получения информации от Mathematica по тем или иным ключевым словам. Начнем код с вопросительного знака, за которым идет искомое слово Chart . Для полноты результата, перед и после слова Chart , вставим звездочки “*”, которые обозначают любую комбинацию знаков, то есть обеспечивают нахождение всех встроенных объектов Mathematica , содержащих в своем названии слово Chart .
Щелчок на любом элементе полученного списка выведет краткую информацию по выбранному элементу, а также, если выбранный элемент является функцией, будет дана информация по ее синтаксису.
Диаграмма BarChart
Первой в нашем списке идет диаграмма BarChart .
Попробуем с ходу применить ее к списку координат, полученному ранее.
В соответствии со своим синтаксисом, BarChart рассматривает каждый подсписок как отдельный набор данных. Поэтому она строит разноцветные попарные столбцы, которые неплохо справляются с требуемой целью. И несмотря на то, что значения откладываются по одной оси, это даже лучше подходит для визуального сравнения. Тем более, что по умолчанию Mathematica выводит значение элемента, на который помещен указатель мыши.
Теперь нужно сделать подписи для каждого отдельного набора данных. Да, именно набора, так как нет смысла дублировать название области для каждого столбика. Для этого, используем опцию ChartLabels .
опция ChartLabels с параметром Placed указывает на то, что подписи должны размещаться строго определенным образом.
первым аргументом параметра Placed является список names , откуда будут браться названия для подписей.
второй аргумент параметра Placed указывает на положение или выравнивание подписей. В данном случае символ Axis указывает на то, что подписи должны располагаться под осью и быть выравнены вдоль оси.
Третий аргумент параметра Placed является командой поворота Rotate , который поворачивает все подписи на 90 градусов. Ввиду того, что нужно развернуть целый список подписей, в качестве аргумента команды Rotate применяется слот # чистой функции ( Function ), которая обозначена символом & за закрывающей квадратной скобкой команды Rotate .
Установочный параметр None , являющийся вторым элементом списка параметров опции ChartLabels , указывает на то, что подписи нужно применить к НАБОРАМ данных, а не к каждому элементу в отдельно взятом наборе. Если этот установочный параметр не указать, то каждый ЭЛЕМЕНТ графика будет подписан первым и вторым именем из списка названий. Попробуйте убрать из выражения установочный параметр None , и увидите что это значит.
Помимо подписей, нам нужно обозначить в чем заключается различие между синими и зелеными столбцами каждого набора. Это реализуется опцией легенды диаграммы ChartLegends . Ее применение очень простое: нужно указать список подписей к легенде. Нужно помнить, что количество элементов в легенде должно совпадать с количеством элементов в наборе данных (при этом, количество наборов не имеет значения).
Еще одна небольшая подсказка кроется в использовании оператора \n для обозначения абзацев в текстовых подписях. Это позволяет управлять внешним видом длинных подписей.
Open-source блокнот Wolfram Language или как воссоздать минимальное ядро Mathematica на Javascript и не только
На Mathics такое не получится, как и многие другие примеры из этого списка тоже не сработают. Вообще, для Wolfram Language (WL) практически невозможно создать полноценный интерпретатор с открытым исходным кодом, потому что многие встроенные решатели являются проприетарной собственностью компании Вольфрама. Однако попытаться можно.
Сложно поспорить с этим утверждением, однако, возможен компромиссный вариант, позволяющий использовать все те же «решатели», но с немного иной open-source оберткой снаружи. В качестве ответа я представляю систему, которая не только воспроизводит многие ключевые функции блокнота Mathematica с нуля, но и расширяет функционал гораздо дальше, чем там, где очертил его границы Стивен Вольфрам, создав эту потрясающую систему более 30-ти лет назад.
. Это не готовый продукт и не замена Wolfram Mathematica
Вставка для привлечения внимания

Здесь мне потребовалось завлечь пользователей этим замечательным корабликом. То, на чем он написан, — это ни что иное как Wolfram Language и то, где он исполняется здесь и сейчас, — Ваш браузер (для тех, кто кликнул на картинку).
Но я обманул Вас, это не open-source блокнот, а нечто другое, но не менее важное, о чем Вы узнаете позже в секциях ниже. Начнем с привычных разделов.
Блокнот? Швейцарский нож
Код, иллюстрации, data-science, презентации — все сегодня возможно написать в пределах скевоморфиозного вида интерфейсов — блокнота


Ячейки разного типа это безусловно преимущество, особенно это касается типа Markdown, когда его «привезут» в Wolfram Mathematica — неизвестно.

Про презентации мы еще поговорим позже.
Бесплатный сыр
Важно отделять Wolfram Language от того, что его реализует — Wolfram Mathematica. Однако это также не совсем верно, так как Wolfram Mathematica это язык и интерфейс к нему (фронтенд), которые, вероятно, соразмерны друг с другом.
(Около-)Свободная реализация языка (см. комментарии про ограничения)со стандартными библиотеками уже давно доступна — это Wolfram Engine, который подобно Питону можно подключить в качестве скриптового языка к чему-угодно.
Отличия интерфейса блокнотов Mathematica от других
Некоторые из вас могут посчитать следующие пункты полезными или бесполезными конкретно для вашей работы или подхода к программированию, однако, нельзя опускать сам факт их реализации — это технически и концептуально сложная задача, которая была великолепно решена. Такое нельзя найти в Jupyter, Obsevable (d3-express), VSCode Notebook API.
Синтаксический сахар
Возведем идею формочек с цветом, которые многие видят в Visual Studio Code, редактируя какие-нибудь CSS цвета

в бесконечность и получим
Graphics3D[Sphere[]] % /. Sphere -> Cuboid

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


Мы получили результат — это тоже выражение. Почему бы не использовать его в последующих вычислениях?
Возможно, языков программирования, которые могли бы воспользоваться этим на благо просто мало.
Двумерный математический ввод
Здесь я явно предвзят, так как являюсь физиком-теоретиком. Что вам нравится больше?
1/Sqrt[2]
В редакторе Хабра это сложно показать, но возможность миксовать код и математические выражения подобные тем, что в LaTeX, — это потрясающе. Представьте, если обобщить это, писать код, вставлять изображения или другие интерактивные объекты в то время, как редактор будет это видеть и обрабатывать как все тот же код. Очевидно, это работа для регулярных выражений.
Зачем изобретать велосипед с открытым исходным кодом
Очевидный вопрос, ведь рынок уже удовлетворен тем, что создает WRI. Время привести недостатки
- Wolfram Mathematica
Проприетарный формат/среда, который/ая стоит дорого- Тяжелый интерфейс (в плане отзывчивости), нестабильный UI (краш, фриз это обычное дело)
- Клиент и среда связаны, сложно вести удаленную сессию с телефона/тостера
- Нельзя делиться блокнотами с поддержкой интерактивности
- Кривой экспорт в PDF и только статические графики/изображения
- Нельзя встроить блокнот на сайт/блог
- Тяжелый и тормозной фронтенд, браузер задыхается при рендере даже текстовых ячеек. Нельзя вставить более 3-5 ячеек внутрь блога/сайта как iframe.
- Строгая политика к облачным файлам: либо подписка, либо удаление, если отсутствует активность
- Ограниченный функционал графики и отображения выражений
- Работает исключительно при наличии интернета
- Превратится в тыкву при желании WRI (Wolfram Research Inc)
Неужели нельзя сделать все «хорошо». Взглянем на Jupyter Notebook, к примеру. Там нет этих недостатков, весь блокнот уместится в единый HTML файл

Эта портативность и легкость заразительна. Взглянем на Observable, где великолепно решены проблемы с интерактивностью и динамикой, чего очень не хватает в Jupyter
Интересная особенность Observable — любая переменная считается динамической. Это все равно, что если бы в Wolfram Mathematica весь блокнот был внутри DynamicModule .
Тернистый путь разработки экосистемы
Здесь могла быть просто демонстрация готового проекта. Но вряд ли кто-то поспорит: Хабр — торт, когда можно чему-то научиться после прочтения текста или узнать что-то новое.
Чтобы решить проблему портативности и совместимости, нет никакого другого варианта, как использовать веб-браузер, который гарантирует, что все будет работать предсказуемо на любой платформе или системе.
WebGUI к консоли
У нас есть Wolfram Engine — это консольное приложение, поддерживающее stdin / stdout и ничего более, за исключением библиотек работы с файлами, сокетами и парочкой инструментов для OpenCL и CUDA вычислений. Пример Jupyter показал, что HTTP сервер с WebSockets протоколом для быстрого обмена TCP-подобными сообщениями с клиентским приложением работает круто. Есть ли HTTP сервер для Wolfram Language.
Нет, но его можно всегда написать. Эта героическая задача была решена с нуля @KirillBelovTest. Можете почитать здесь. Причем не только про сервер, но и про высокоскоростной интерфейс сокетов (sockets), написанный им же с нуля на чистом Си для поддержания кроссплатформерности.
Таким образом, задача по прикручиванию веб-интерфеса складывается из достаточно типичных для современного веба блоков

В качестве шаблонизатора я написал WSP (Wolfram Script Pages) как PHP-подобный язык, только для Wolfram Language. Но сейчас он был замещен его наследником WLX (Wolfram Language XML), вдохновленным синтаксисом JSX.
Пример, как это может выглядеть
(* package manager to make sure you will get the right version *) PacletInstall["JerryI/LPM"]; "https://github.com/KirillBelovTest/Objects", Github -> "https://github.com/KirillBelovTest/Internal", Github -> "https://github.com/JerryI/CSocketListener", Github -> "https://github.com/KirillBelovTest/TCPServer", Github -> "https://github.com/KirillBelovTest/HTTPHandler", Github -> "https://github.com/KirillBelovTest/WebSocketHandler", Github -> "https://github.com/JerryI/wl-misc", Github -> "https://github.com/JerryI/wl-wlx" >] (* packages for HTTP server *) HTTPPacketLength; tcp["MessageHandler", "HTTP"] = HTTPPacketQ -> http; (* main app file *) index := ImportComponent["index.wlx"]; http = HTTPHandler[]; http["MessageHandler", "Index"] = AssocMatchQ[ <|"Method" ->"GET"|>] -> Function[x, index[x]] SocketListen[CSocketOpen["127.0.0.1:8010"], tcp@# &]; StringTemplate["open http://``:``/"][httplistener[[1]]["Host"], httplistener[[1]]["Port"]] // Print; While[True, Pause[1]];где в директории, откуда вы запускаете скрипт, находятся два файла
index.wlx
Main = ImportComponent["main.wlx"]; />А также файл с самим «приложением»
main.wlx
(* /* HTML Page */ *)WLX Template Title
Local timeЗайдя на страницу в браузере 127.0.0.1:8010, можно будет увидеть следующее

Как видно, все страницы представляют собой обычные HTML-документы с расширенным синтаксисом, таким образом, что теги, начинающиеся с заглавной буквы, считаются выражениями Wolfram Language
Формируя страницы из компонент, можно писать своего рода «веб-приложения». Далее я не буду вдаваться в подробности этого подхода, так как объем материала тянет на отдельную публикацию.
Интерпретатор языка Wolfram в браузере
Зачем? Он же уже есть!
Вернемся к простой задаче, как показать график из консоли, если кто-то не заплатил 300$ WRI. Откроем терминал и введем wolframscript , затем
Plot[x, ]и увидим следующее
- Graphics -На самом деле можно вытащить больше информации, применив
ExportString[Plot[x, ], "ExpressionJSON"][ "Graphics", [ "Line", [ "List", [ "List", 2.040816326530612e-8, 2.040816326530612e-8 ], [ "List", 3.0671792055962676e-4, 3.0671792055962676e-4 ],Это ни что иное, как «рецепт» приготовления этого блюда. Остается найти повара, точнее написать. Как и на чем? Кажется очевидным, исходя из факта того, что у нас будет WebGUI
//набор будущих функций const core = <>; //интерпретатор const interpretate = (expr, env = <>) => < if (typeof expr === 'string') return expr; //строка if (typeof expr === 'number') return expr; //число //значит это выражение WL const args = expr.slice(1); return core[expr[0]](args, env); >Окей, теперь давайте объявим выражение List . Я думаю, следующее будет ясным без дополнительных разъяснений
//async это круто! core.List = async (args, env) => < const list = []; const copy = ; for (const i of args) < //запишем результат интерпретации списка или массива WL в массив list //env передается как глубокая копия, для того, чтобы изменения ее внутри не влияли на обзекты снаружи списка list.push(await interpretate(i, copy)); >return list; >Почему так сложно? Покажу пример использования List
Graphics[], ]>, Point[]>]
Здесь видно, что <> или по-другому List[] изолирует «shared» параметры среды внутри от других листов, которые не являются вложенными. По этой причине в версии JS мы копируем переменную env , которая будет хранить такие опции, как цвет, толщина, да и все что угодно.
Остается реализовать Line , RGBColor , саму функцию Graphics и мы уже можем строить графики. Полный код приведен здесь, однако я приведу пример на псевдо-языке, как это может выглядеть
core.Line = async (args, env) => < const data = await interpretate(args, env); env.canvas.putLine(data, env.color); return null; >core.RGBColor = async (args, env) => < const color = await interpretate(args, env); env.color = `rgb($, $, $)`; >
В целом, нужно также рассмотреть ситуации, когда вложенные выражения меняются со временем и бегать по соответствующей ветке древа для того, чтобы пересчитать положение линий и т.д., например, для таких случаев
Важно заметить, что ядро Wolfram здесь никак не вовлекается, разве что для непосредственного семплирования функции, находящейся в Plot . Живую демонстрацию того, что может этот интерпретатор, если наполнить его всеми необходимыми примитивами, можно увидеть на странице с документацией.
Добавив еще пару функций и библиотеку THREE.js, получается делать такие картинки
VectorPlot3D[, , , , VectorColorFunction -> Function[, ColorData["ThermometerColors"][x]]][[1]]; %/. Sequence[RGBColor[r/50,g/50,b/50], Emissive[RGBColor[r,g,b], 5]],>; Graphics3D[, 0.9]>, Lighting->None, RTX->True]
Graphics3D[< Blue, Cylinder[], Red, Sphere[], Yellow, Polygon[, , , >] >]
Как связать Wolfram Kernel и Javascript машину?
Нужен наиболее эффективный способ передачи данных. Кроме того, если это будет интерфейс блокнота, нужен API.
Мне никогда не нравилась идея классических API, которые сейчас имеются для взаимодействия фронтенда с бэкендом у современных приложений. Я испытываю легкое чувство неловкости, объявляя что-то подобное
//где-то на сервере/клиенте switch(command) < 'ping': printf('Pong!'); break; . >//где-то на клиенте/сервере send();Я, конечно, утрирую, но это точно плохой путь для блокнота Wolfram Language. У нас есть вебсокеты и интерпретатор, верно?
(* сервер *) serialize = ExportString[#, "ExpressionJSON"]&; WebSocketSend[client, Alert["Hello world!"] // serialize]/* клиент */ const Socket = new WebSocket("ws://127.0.0.1:port"); Socket.onmessage = function (event) < interpretate(JSON.parse(event.data)); >; //какая-то функция нужная на фроентенде core.Alert = async (args, env) =>Разве не прелесть? Мы можем разговаривать с UI на том же языке, на котором работает ядро. Очевидно, что если целиться на ячеечную структуру блокнота, пригодятся также и такие функции
FrontEndCreateCell[. ] FrontEndDeleteCell[. ] FrontEndEvaluate[. ] .Для обратной связи мы можем воспользоваться тем же форматом JSON, так как ничего не стоит отправить данные от JS по каналу веб-сокетов и на стороне Wolfram Kernel сделать подобное
ImportString[input, "JSON"] // HandlerFunctionлибо еще проще и быстрее, минуя JSON
input // ToExpressionМногие скажут БЕЗОПАСНОСТЬ, однако, для локального приложения это не вреднее, чем позволять жить у себя NodeJS серверу с, в принципе, неограниченными правами на чтение/запись и запуск любого системного процесса.
Его величие — редактор
Это, вероятно, чуть ли не самое сердце любого блокнотного интерфейса. Самые очевидные функции могут быть получены почти любым JS редактором кода:
- подсветка синтаксиса (желательно, любого)
- навигация как в привычных редакторах, так и в Vim
- скорость и легкость
Однако, вспомним про синтаксический сахар и требование к «редактируемости» выходных ячеек.
Как отобразить график внутри кода?
Декорации — этот концепт был введен еще давно до появления JS и веб-редакторов кода, но в полной мере воплощен только в CodeMirror 6. Представьте себе, что мы можем написать некий виджет, который заменяет собой выражение в виде строки
//выражение, которое ищется и заменяется const ExecutableMatcher = (ref) => < return new MatchDecorator(< regexp: /FrontEndExecutable\["([^"]+)"\]/g, decoration: match =>Decoration.replace(< widget: new ExecutableWidget(match[1], ref), >) >) >; //сам виджет class ExecutableWidget extends WidgetType < constructor(name, ref) < super(); this.ref = ref; this.name = name; >eq(other) < return this.name === other.name; >//та самая функция которая заменяет текст на DOM элемент toDOM() < let elt = document.createElement("div"); //абстрактно создаем объект и исполняем его this.fobj = new ExecutableObject(this.name, elt); this.fobj.execute() this.ref.push(this.fobj); return elt; >ignoreEvent() < return true; >destroy() < >>Это, так называемые, ReplacingDecorations. Исходный текст под ними остается нетронутым, а декорируемое выражение атомизируется, занимая место лишь одного символа для каретки. В этой связи возникает простая и элегантная идея отображения всех интерактивных объектов как выражение-«ключевая строка» FrontEndExecutable[«id»] с ссылкой на объект JSON, где будет находиться рецепт для интерпретатора, чтобы отобразить красивый график

Остается лишь создать правила, по которым выражения будут заменяться на ключевые строки и передавать параллельно сопутствующие данные в виде JSON.
Не пугайтесь абстрактного кода, позже будет ссылка на CodeSandbox, где эти игры с редактором CodeMirror можно попробовать самим.
Что насчет математических выражений?
Грубо говоря, как отобразить дробь? А дробь в дроби в дроби . Я полагаю, что лучше один раз показать на примере
и как это можно «закодировать»
CMFraction[1, CMSqrt[6]]Остается пробежаться регулярными выражениями и распарсить это в редакторе как
Зачем там написано Editor — я хотел лишь подчеркнуть, что числитель и знаменатель дроби, как и ячейка под корнем, обязаны быть такими же текстовыми редакторами с подсветкой синтаксиса, как и «основной» редактор

Итого на такое выражение потребуется создать 3 инстанса CodeMirror 6. Что не так плохо. А что на счет матриц?
CMGrid[, , >]
Итого 10 редакторов! Хотите 26? Тогда попробуйте посмотреть результат этого выражения
Table[If[PrimeQ[i], Framed[i, Background->Yellow], i], ]Это скриншот со страницы документации проекта, где это работает вживую

Когда число доходит до 50-100, главный редактор уже значительно тяжелее переваривает изменения в дочерних редакторах.
Я оформил это расширение как отдельный NPM пакет, так люди могут использовать его в своих проектах с Wolfram Language независимо от фронтенда. Ссылка на песочницу.
в песочнице сочетания Ctrl+- , Ctrl+/ на выделенном коде создадут индекс и дробь, соотвественно.
Портативность
Так как редактор и ячейки все равно уже «живут» в браузере, значит, экспорт блокнота в HTML файл не составит труда. В предыдущих секциях мы договорились использовать веб-сокеты для управления структурой блокнота, соотвественно, если просто записать последовательность команд при старте блокнота вроде
commands = < FrontEndCreateCell[. ], FrontEndCreateCell[. ], . >;и эмулировать это с помощью Javascript при открытии HTML-файла, то эффект будет тот же, что и в настоящем блокноте. Все необходимые библиотеки можно «утащить» туда же.
К примеру, документация к этому проекту сделана подобным образом
Сам факт того, что в браузере «крутится» обрезанная версия интерпретатора Wolfram Language, позволяет переносить часть логики напрямую в браузер. Таким образом, можно сохранить частичную интерактивность, даже без запущенного ядра Wolfram Engine.
Open-source блокнотный интерфейс Wolfram Language
В англоязычной среде и документации он встречается под названием WLJS Frontend. Почему так? Это не так важно.
Если скомбинировать все методы и подходы, описанные в предыдущих частях, то получится следующее приложение

Особенность в том, что это всего лишь веб-сервер. А само приложение — это страница HTML с самым ванильным Javascript (за исключением библиотек, необходимых для отрисовки графики). Таким образом
- пользователь может изменять стиль всего интерфейса;
- ядро может произвольно менять структуру документа, а также вызывать любой Javascript код на ней (привет eval() );
- фронтенд доступен с любого устройства, способного открывать заглавную страницу Хабра;
- можно экспортировать блокнот в HTML с частичным сохранением интерактивности;
- оно принадлежит Вам целиком, не нуждается в интернете и работает локально.
Разумеется для удобства есть версия, где оно обернуто в ElectronJS, что позволяет привнести привычные для системных приложений доступы к проводнику и полноценному контекстному, а также оконному меню.
Ячейки
Зачем меня принуждают писать на Wolfram Language, когда я хочу сделать красивую диаграмму. Мне вообще-то нравится Mermaid

Идея обращения к анонимному файлу .mermaid мне кажется красивой. Давайте также обратимся к Markdown
.md # Hey, how was your day? I think it was fine. It is and I am still writting my post for Habr
Нет, мне вообще на самом деле нравится Tailwind, и я хочу оформлять свои данные с помощью него
.html
Да зачем мне все эти сложности, я хотел график построить, но если бы можно было его еще покрутить.
Нет, я на самом деле хотел записать в файл
filename.txt Hello World
JS Cells
Сильной стороной являются ячейки типа .js , так как сам фронтенд написан в основном на JS. Как я уже описал выше, на сервере и на клиенте работают интерпретаторы Wolfram Language, соотвественно, подписываться на события друг друга или вызывать функции можно напрямую
.js const element = document.createElement('span'); core.ShowText = (args, env) => < element.innerText = await interpretate(args[0], env); >return element;и затем из ячейки WL
ShowText["This is a text"] // FrontSubmitЕсли пойти дальше, можно делать вещи чуть более сложные
С помощью расширения wljs-esm-support, можно также подключить Node и бандлер ESBuild, тогда у вас появится возможность использовать любой пакет с NPM. Как и сделал я, когда мне понадобилось подключить свой контроллер Nintendo Pro.
LLM Chatbook
Для каждой задачи подойдет свой язык — это бесспорно, но еще лучше, если эту задачу решат за тебя
.llm Plot a butterfly curve using Wolfram Language
Это дополнение было разработано @KirillBelovTest, который также является автором сервера и сейчас также активно принимает участие в разработке.
Благодаря тому, что llm имеет доступ ко всем ячейкам, и его вывод ничем не отличается от пользовательских ячеек, складывается приятное иммерсивное ощущение, что это не чат-бот, а некий гик, который случайно забежал и набрал что-то с клавиатуры в блокноте.
Редактор
Как и было описано ранее, он поддерживает математический ввод и синтаксический мёд в полной мере благодаря CodeMirror 6
Вопрос, как сделать autocomplete для тех символов, которые объявил пользователь? Как оказалось, с 1999 года в Wolfram Kernel есть следующая функция
$NewSymbol = Print["Name: ", #1, " Context: ", #2] &Таким образом, можно буквально отслеживать все, что было создано за текущую сессию, и отправлять эти данные в браузер.
Динамика и интерактивность
Разумеется, что нельзя соревноваться с Mathematica, не имея в арсенале инструментов для создания динамических графиков и ползунков.
В процессе создания я значительно переработал этот концепт. Меня раздражала непредсказуемость поведения динамических выражений в Mathematica, которые рано или поздно приводили к падению всего приложения.
Зачем пересчитывать все заново, когда поменялись данные, если можно делать это селективно
core.Line = () => < //получаем все данные //обрабатываем //рисуем canvas.putLine(); >core.Line.update = () => < //обновляем canvas.updateLine(); >Я к тому, что у каждой функции должен быть метод для обновления, если данные поменялись. И на каждом выражении можно принять решение о том, как и что пересчитать.
Минусом такого подхода является пожалуй то, что этот метод нужно писать вручную для каждого «важного» для пользователя выражения (в основном графические примитивы), как в Mathematica по-умолчанию интерпретатор проходится по всему древу одинаково, что при первом запуске, что при обновлении данных.
Следующее изменением — событийно-ориентированный подход. Возьмем слайдер
slider = InputRange[-1,1,0.1, "Label"->"Length"]и привяжем к нему функцию-обработчик
EventHandler[slider, Function[l, length = l]]; EventFire[slider, 0]; (* шарахнем один раз, чтобы все инициализировалось *)А теперь сам элемент, который будет под контролем
Graphics[, ] >]Очевидно, это сразу больше кода, однако, хирургическая точность таких методов позволяет эффективно обновлять данные
Такую отзывчивость сложно представить в Mathematica. Либо такой пример
Обладателей Nvidia RTX приглашаю взглянуть на эти две сферы
Graphics3D[< ]>, >, Lighting->None, RTX->True]
Расширяемость
Разумеется, имеется система плагинов/расширений, где возможно добавить новые типы ячеек, влиять на ход исполнения ячеек, расширять библиотеку функций и т.п. Сам проект собран из более 10 расширений, половина из которых являются системными и могут работать отдельно.
Хороший пример — анимация на сайте конференции Wolfram Saint-Petersburg 2023, где используются всего лишь два компонента:
- wljs-interpreter — интерперататор WL
- wljs-graphics-d3 — библиотека реализующая примитивы Graphics
Слайды/Презентация из компонентов
Работая в академической среде, мне никогда не нравилось готовить презентации к докладам, на визуальное исполнение которых уходит большая часть времени, вместо самого содержания. Почему так? Поясню:
- для обработки данных используется среда A
- для визуализации среда Б
- для слайдов среда С
Передача данных между ними осуществляется путем сериализации в файл, что, скажем, не очень быстро и удобно. Ах да, не забудем про
- перетаскивание блоков с информацией / копирование их на другие слайды
В open-source сообществе уже есть решения на этот счет, скажем, — RevealJS с возможностью писать слайды на языке Markdown. Однако, здесь все равно не хватает компонент и, как собственно, способа передачи графических данных.
Markdown поддерживает HTML из коробки, значит, у нас уже есть доступ к стилям и оформлению, если хочется. Допустим, как сделать две колонки?
.html12Было бы здорово сделать такой компонент. С использованием WLX это возможно
.wlx Columns[C1_, C2_] := With[,]Теперь вернемся к нашим слайдам, мы ведь с этого начали
.slide # TitleFirst column Second one
Не обращайте внимание на Identity оператор, так как он нужен чтобы подсказать WL, что вторая фраза — это уже второй аргумент к функции Columns .
А что насчет графиков?
Plt3D = Graphics3D[Cuboid[]];.slide # Embed some figures Even 3DTry to move it using your mouseМожно привязаться к событиям: появление фрагмента на слайде или его смена, либо вставлять напрямую компоненты ввода (ползунки) и кнопки. Ниже представлена презентация, которую я использовал на докладах в 2023 году
Она, как и все другие примеры, доступна в самом приложении фронтенда через оконное меню File — Open Examples.
Приложения на WLX
Здесь пример, как можно использовать динамику и язык разметки WLX, чтобы набросать простенькую утилиту с графическим интерфейсом для распознавания таблиц с картинок
.wlx LeakyModule[, (* поле drop file *) Ev = InputFile["Drop an image here"]; (* вешаем на него обработчик *) EventHandler[Ev, Function[file, (* импорт по формату и само распознование текста *) pipe = ImportByteArray[file["data"]//BaseDecode, FileExtension[file["name"]]//ToUpperCase]; pipe = Binarize[pipe]; pipe = TextRecognize[pipe]; output1 = ToString[pipe, InputForm]; output2 = ToString[(ToExpression /@ StringSplit[#, " "]) &/@ StringSplit[pipe, " "], InputForm]; ]]; (* выходные значения *) output1 = "- none -"; output2 = "- none -"; (* два поля вывода с подсветкой синтаксиса *) EditorRaw = EditorView[output1 // Offload] // CreateFrontEndObject; EditorProcessed = EditorView[output2 // Offload] // CreateFrontEndObject; (* шаблон разметки выходной ячейки в HTML (WLX) *)]Raw string
Processed string
Видео в действии
Вывод ячейки в окно
Это побочная функция, созданная для возможности показывать слайды. Однако, также может быть полезной, когда блокнот становится слишком большим для навигации. Мой рабочий стол обычно выглядит как-то так

Ограничения
Обойти достижения WRI последних 20-лет двум разработчикам за год невозможно и бессмысленно (у нас нет такой цели и не будет). WLJS Frontend это альтернативный инструмент со своими преимуществами и недостатками, где для решения архитектурных проблем в одних областях были приняты компромиссные решения в других, но не замена.
@KirillBelovTestи я постарались скомпилировать бинарные файлы компонент веб-сервера под каждую платформу, однако, различия все же встречаются, что периодически пополняет банк Issues на гитхабе. Если нужна «горячая поддержка», вступайте в группу поддержки в Телеграмме.
Из других примеров, до сих пор нет функции Circle в пакете Graphics, просто потому, что она редко используется в типичных plot-функциях Mathematica и чьи-то руки не дошли до того, чтобы написать десяток строчек кода на JS. Тем не менее, большая часть функций, которая касается построения данных по точкам, уже покрыта — смотрите здесь.
Проект развивается и дополняется почти каждый день. Это не готовый продукт, в отличие от Wolfram Mathematica.
«Этот список» из цитаты в начале статьи
Вызов брошен, а как же ответ? Вот адаптированные сниппеты из списка, который показал автор
d=theta@t-phi@t; sol = NDSolve[,>,theta@0==2,phi@0==1,theta'@t==phi'@t==0/.t->0>,,];With[&>, With[, LeakyModule[, EventHandler[EvaluationCell[], Function[Null, TaskRemove[task]]>]; handler := (points = Table[f, ]; pendulum1 = Table[m1, >] // First; pendulum2 = points // Last;); handler; task = SetInterval[ time = time + 0.1; handler; If[time > 59., TaskRemove[task]]; , 70]; Graphics[< Line[points // Offload], PointSize[0.05], Red, Point[pendulum1 // Offload], Point[pendulum2 // Offload], Line[] >, Controls->True, Axes->True, TransitionDuration->10, TransitionType->"Linear"] ] ] ]и демонстрация, если это запустить в блокноте
Другой «сниппет» из той же ветки
StreamPlot[,,]
LeakyModule[, data = CellularAutomaton[,,>>,>, Table[RandomInteger[], , ], 50]; frame = 255 data[[i]]; EventHandler[EvaluationCell[], Function[Null, TaskRemove[task]]>]; task = SetInterval[ i = i + 1; frame = 255 data[[i]]; If[i > 49, data = CellularAutomaton[,,>>,>, data//Last, 50]; i = 0; ]; , 50]; Image[frame // Offload] ]SphericalPlot3D[Re[Sin[\[Theta]]Cos[\[Theta]]Exp[2I*\[CurlyPhi]]],,]Спасибо за внимание
