Помогаю со студенческими работами здесь
Как найти значение первой и второй производной функции в определенной точке?
Не подскажете новичку, как найти значение первой и второй производной определенной функции в…
Вычислить значение полинома в точке с помощью специальной функции и подстановкой. Сравнить результаты
Вычислить значение полинома p(x)=x^3+8x^2+10x+4 в x=1.25 точке с помощью специальной функции и…
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором…
Для функции F(x) написать подпрограммы-функции, вычисляющие значение 1-ой и 2-ой производных в заданной точке x
Для функции F(x) написать подпрограммы-функции, вычисляющие значение 1-ой и 2-ой производных в…
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором…
Используя указатели на функцию вычислить значение функции в точке X в соответствии с выбором функции пользователем
Решил выложить свои лабораторные работы 1-10 за первый курс, первого семестра…
Искать еще темы с ответами
Или воспользуйтесь поиском по форуму:
Добавить комментарий
Введите свой комментарий…
Заполните поля или щелкните по значку, чтобы оставить свой комментарий:
E-mail (обязательно) (Адрес никогда не будет опубликован)
Имя (обязательно)
Сайт
Для комментария используется ваша учётная запись WordPress.com.
( Выход /
Изменить )
Для комментария используется ваша учётная запись Facebook.
( Выход /
Изменить )
Отмена
Connecting to %s
Уведомлять меня о новых комментариях по почте.
Уведомлять меня о новых записях по почте.
Как задать n мерный вектор wolfram mathematica
Wolfram Language (Mathematica) на русском языке… или продвинутое задание функций
Одним из самых важных навыков в работе с системой Mathematica, является задание функций, которые имели бы самый разный вид, и зависели бы от разного количества переменных (от буквально ни одной переменной до бесконечного их количества), при этом некоторые переменные могли бы иметь значения, которые используются по умолчанию, если не вводятся их конкретные значения, другие имели бы вид опций, как у многих встроенных в Mathematica функций, или имели бы строгие ограничения на свой тип…
В данном посте будет показано как программировать в Mathematica на русском языке, а для этого я покажу как создать функции, имена которых задаются кириллицей, соответствующие оригинальным встроенным функциям. При этом вы познакомитесь с тем, как собственно задавать самые разные типы и виды функций.
Мне хотелось бы отметить, что в версии 10.1 языка Wolfram Language (Mathematica) начался процесс русификации интерфейса, документации и предсказательного интерфейса. Для ряда языков, например, китайского, процесс полной локализации уже практически завершен. При этом, более того, даже сервис Wolfram|Alpha скоро сможет работать на китайском.
Создание стандартных функций нескольких переменных
Отсроченное задание функции
Задать стандартную функцию можно с помощью конструкции вида:
В данной конструкции участвуют три крайне важных функции Mathematica, первая — это отсроченное присваивание SetDelayed (в короткой форме имеет вид :=), вторая — шаблонное выражение Blank[] (в короткой форме имеет вид _), третья — шаблон с присвоенным ему именем Pattern[name, object] (в короткой форме имеет вид name:object, или, если шаблонный объект представляет собой просто _, то name_).
Рассмотрим подробнее зачем они нужны и как работают.
- Отсроченное присваивание := употребляется в виде:
оно присваивает выражение rhs (сокращение от “right hand side” — справа) в качестве отсроченного значения объекта (символа) lhs (сокращение от “left hand side” — слева), при этом выражение rhs остается в невычисленном виде. Как только в коде встречается объект lhs, он заменяется на выражение rhs, которое после этого вычисляется.
- Шаблонное выражение _ употребляется в виде:
оно олицетворяет собой любое выражение, написанное на языке Wolfram Language. При этом, шаблон _h задает любое выражение, головная часть которого совпадает с h.
- Шаблон с присвоенным ему именем name_ употребляется в виде:
он служит для “передачи” объекта внутри используемых функциональных конструкций (правил замен, задании функций и т. п.)
Что ж, суммируя сказанное выше, можно сказать, что стандартное задание функции одной переменной имеет вид:
которое в полной форме (в той, которой его на самом деле “видит” и использует Mathematica) выглядит так:
Задание функции в виде отсроченного присваивания, которое в общем случае имеет вид:
работает следующим образом:
- как только Mathematica встречает при вычислении кода функцию с именем f, она проводит сопоставление ее вычисленного аргумента expr (если она встретила выражение f[expr]) с шаблоном pattern. В том случае, если выражение-аргумент expr удовлетворяют шаблону pattern, то конструкция f[expr] заменяется на выражение lhs, в котором все символы с именем, соответствующем имени шаблонного выражения pattern заменяются на выражение expr, после чего полученная конструкция вычисляется и замещает исходное выражение f[expr].
Понятно, что если используется задание функции вида f[v_]:=lhs[v], то, как было сказано выше, любое выражение expr удовлетворит шаблону v_.
Приведу пример. Зададим функцию, которая вычисляет :
Попробуем вычислить ее значение от разных аргументов:
Как видно из рассмотренных выше примеров, действительно любой объект (число, символ, картинка) удовлетворяют шаблону x_ и Mathematica легко работает со всеми выражениями, что демонстрирует необычайную гибкость ее языка.
Задание функции многих переменных полностью аналогично. Скажем, зададим функцию 3 переменных:
Создание функции, которая “помнит” свои вычисленные ранее значения
Если изменить отсроченное задание функции следующим образом:
то однажды вычислив значение в некоторой “точке” (значение при некотором значении аргумента, аргументом может быть не обязательно число и необязательно точка в привычном ее понимании. ), функция f будет помнить (правда только в рамках данной сессии Mathematica) это значение (здесь была использована функция Set (в короткой форме имеет вид =), которая позволяет присвоить некоторому символу некоторое значение).
Такое задание функции способно сэкономить массу времени, если вычисление правой части отсроченного присваивания функции занимает много времени, но при этом требует больше памяти.
Пример (время вычисления некоторой команды можно узнать с помощью функции Timing):
Из примера видно, что однажды вычислив значение функции в точке, при таком задании функции, в следующий раз оно не займет никакого времени.
- Внимание! Такое присваивание может сыграть с вами злую шутку. Так как значение функции в данной точке хранится в памяти, оно становится нечувствительным к изменению собственно правой части lhs[v] функции:
Абсолютное задание функции
В том случае, если использовать вместо функции SetDelayed (:=) функцию Set (=) в задании функции:
то выражение справа lhs[v] будет вычислено сразу, после чего в него будут подставляться значения аргументов функции при встрече в дальнейшем выражения вида f[expr] в коде. Такая форма задания функции способна сэкономить время в том случае, если вычисление выражения lhs[v] трудоемко и по сути не зависит от конкретного значения аргумента v.
Сравним отсроченное и абсолютное задания функций.
Вычисление выражения lhs[v] не зависит от значения v напрямую:
Вычисление выражения lhs[v] зависит от значения v напрямую:
Из двух примеров выше можно сделать два важных вывода:
- Внимание! Абсолютное задание можно использовать только в том случае, если вычисление конструкции lhs[v]не зависит напрямую от переменной v. Если это не так, то ответ может быть не верен.
- В случае применения абсолютного задания функций, вы получаете возможность заметно ускорить свои вычисления в ситуации, когда вычисление правой части задания функции не зависит напрямую от аргумента.
Задание функции, некоторые аргументы которой имеют значения по умолчанию
В некоторых ситуациях удобно использовать функции, некоторые переменные которых имели бы значения по умолчанию. Задать такого рода переменную для функции можно с помощью функции Optional, которая употребляется следующим образом:
Зададим функцию, которая строит круг или окружность, при этом по умолчанию центр этого круга (окружности) находится в точке (0, 0), он (она) имеет радиус равный 1, а также имеет красный цвет:
Очевидным неудобством работы с такими функциями является то, что если вы хотите использовать много аргументов со значениями по умолчанию, то использовать эти значения у вас получится только в том случае, если они стоят справа от тех аргументов, которым вы придаете какое-то значение. Если же вы меняете какое-то значение по умолчанию на конкретное, то вам придется в обязательном порядке явно указывать и все значения, что стоят левее от него. Таким образом, данное задание очень чувствительно к порядку следования аргументов, а значит переменные со значениями по умолчанию должны располагаться в порядке убыли частоты их использования, если же частота примерно одинакова, то целесообразность задания таких функций резко падает.
Задание функции с опциями
Для того, чтобы избавиться от проблемы, связанной с использованием переменных, которые имеют значения по умолчанию, которая рассматривалась выше, служат функции, которые имеют так называемые опции. Большинство встроенных функции Mathematica имеют те или иные опции.
Для того, чтобы задать опции для некоторой функции, служат встроенные функции OptionsPattern и OptionValue, смысл работы с которыми ясен из следующего примера: реализуем ту же функцию, что и ранее (строящую круг или окружность, с центром по умолчанию в точке (0, 0), радиуса 1, красного цвета), только все значения по умолчанию теперь задаются опциями:
Задание функции с наложенными на аргументы условиями
Для того, чтобы наложить на какой-то аргумент функции ограничение, служит функция Condition (имеющая короткую форму /;).
Скажем, создадим функцию, которая вычислялась бы, только если ее аргумент больше 2:
Или функцию, которая вычислялась бы, если ее аргумент является списком, состоящим не более чем из 4 элементов:
В примере выше также использовался шаблон с указанием головной части выражения List (x_List), который задает любой список.
Такого рода шаблоны могут быть самыми разными:
Также вы можете пользоваться всевозможными тестовыми функциями, которые проверяют, обладает ли выражение, определенным свойством. Это делается с помощью функции PatternTest (имеющая короткую форму ?), стандартный синтаксис которой выглядит следующим образом:
Все тесты (как видно из кода ниже, их 128) в системе Mathematica это функции, которые оканчиваются, как правило, на заглавную букву Q:
128
Скажем, вот так просто можно создать функцию, которая будет работать только с простыми числами:
Альтернативные шаблоны
В некоторых случаях функция должна работать с выражением, если оно удовлетворяет одному из заданных шаблонов. Реализовать подобную конструкцию можно с помощью функции Alternatives (имеющая короткую форму |).
Ниже представлена функция, аргумент которой может быть либо списком, либо целым числом, большим 4:
Множественное задание функций (перегрузка функций)
В Mathematica у вас есть возможность задать определения функции, которые будут применяться в разных ситуациях. Сделать это можно с помощью применения шаблонов с головными частями выражений, а также с использованием ограничений, наложенных на переменные.
В примере ниже создана функция, которая по разному обрабатывает входные данные в зависимости от их типа:
Пример: композиция из описанных ранее способов задания функций и ее аргументов
Программирование в Mathematica на русском языке
Теперь, когда мы знаем о том, как задаются функции, можно поставить перед собой такую задачу: сделать так, чтобы можно было программировать в Mathematica на русском языке с соблюдением основных парадигм: встроенные функции капитализированы и их названия в точности соответствуют действию, которое они осуществляют.
Для этого, нужно сделать русские аналоги встроенных функций.
Начнем с функции Plot, на русском языке ей будет соответствовать функция График. Синтаксис функции Plot имеет вид:
Ее русский аналог будет полностью аналогичен.
Начнем с того, что узнаем список всех опций функции Plot и их значения по умолчанию, это можно сделать с помощью функции Options:
Теперь создадим этот список на русском языке (здесь опущены некоторые опции, которые, по опыту, употребляются крайне редко при построении графика):
Теперь зададим связь русских названий с встроенными аналогами:
Теперь мы можем задать русский аналог функции Plot:
Также нам потребуются некоторые стандартные обозначения толщины и цвета линий:
Аналогично зададим функцию Решить — русский аналог функции Solve, АбсолютныйРазмерТочки — AbsolutePointSize, Точка — Point, Линия — Line:
Попробуем создать некоторый график:
Таким образом, в Mathematica возможно создать пакет, который позволит программировать на обычном русском языке, подобно тому, как это делалось в СССР, скажем на языке АЛМИР-65.
Если у кого-то из вас появится желание развить данную идею, то вполне возможно сделать так, чтобы Mathematica работала на русском языке.
Как изменить форму матриц в Mathematica
При манипуляциях с матрицами часто бывает удобно изменить их форму. Например, чтобы превратить матрицу размером N x M в вектор длины N X M. В MATLAB существует функция reshape :
RESHAPE (X, M, N) возвращает матрицу размером M на N, элементы которой берутся из X по столбцам. Если X не содержит M * N элементов, возникает ошибка.
В случае преобразования между матрицей и вектором я могу использовать функцию Mathematica Flatten , которая использует представление вложенных списков Mathematica для матриц. В качестве быстрого примера предположим, что у меня есть матрица X:
С помощью Flatten [X] я могу получить вектор . Но что было бы гораздо полезнее, так это что-то вроде применения reshape (X, 2,8) в Matlab, что привело бы к следующей матрице:
Это позволит создавать произвольные матрицы, размеры которых равны N * M. Насколько я могу судить, здесь нет ничего встроенного, что заставляло бы меня задаться вопросом, не создал ли кто-то собственную функцию Reshape.
Научный форум dxdy
Последний раз редактировалось Into the Fire 01.01.2017, 22:57, всего редактировалось 4 раз(а).
У меня опять просьба о помощи в построении 2D векторного поля. Еще раз о задаче: имеются двухмерные массивы, например,
компоненты скорости u [i, j] и v [i, j] по координатам х, у соответственно, i , j – индексы по координатам х, у, максимальные значения i =81, j=161.
Значения скорости получены расчетным путем, записаны в отдельные файлы с расширением .dat, т.е. имена файлов условно uf.dat и vf.dat.
Требуется построить поле вектора скорости V (u,v) в виде стрелок. Ввод данных из папки, куда записаны файлы uf.dat и vf.dat, в саму Mathematica
проводится с использованием опции из главного меню Insert и File Path, получается:
Не надо так оформлять код.
Into the Fire , давайте начнём с маленьких «игрушечных» примеров. Размером четыре на четыре, скажем. И будем задавать их непосредственно в рабочем документе, не импортируя извне. Разберёмся с ними, а там, глядишь, и до настоящего дела доберёмся.
ListVectorPlot мне вообще ничего не рисует, а только жалуется на что-то.
Учебник смотрел непосредственно в Mathematica , вход через главное меню:
Help –> Wolfram Documentation – после этого появляется таблица Wolfram Language & System , в таблице есть раздел Visualization & Graphics , где приводятся примеры использования. Вот один из примеров:
http://s30.postimg.org/5pv492xoh/F_1_Page_1.jpg
Пробовал в ручную задать компоненты u, v размерностью 4х4. Вот что у меня получается:
http://s23.postimg.org/cgz5wp6jf/Fvu_3_Page_1.jpg
При этом каждый из векторов в отдельности рисуется, например:
http://s23.postimg.org/e2efoigrf/Fv_4_Page_1.jpg
Для проверки попробовал в MATHCAD изобразить векторное для таких же значений u, v. Получается нормально
http://s28.postimg.org/s0aupuhl9/Fmath_Page_1.jpg
Так и не пойму, в чем у меня ошибка.
Несколько запоздалый и оффтопичный комментарий, но. все-таки зачем пытаться для решения подобной задачи использовать инструмент совершенно другого назначения (причем большой, неудобный для интеграции и дорогой), если есть другие, лишенные всех этих недостатков?
Самый обычный gnuplot сделает это буквально одной командой. Входной формат чуть отличается, но это легко переделать (в т.ч. и средствами gnuplot). Берем файл с подобным содержимым:
Как вам уже говорили, для массива данных нужна команда ListVectorPlot . Чтобы работало, надо в справке смотреть, в каком виде должны быть аргументы. Если это проделать, то выяснится, что нужный формат это список data= , где каждый элемент имеет вид a1= . Т.е. вот так работать будет:
Как получить такой формат данных? Ответ: надо знать команды работы со списками. А также формат, в котором данные у вас. Если после импорта они имеют вид списка списков длины четыре: data= , то можно поделить данные на пары командой Partition[#, 2]&/@data .
Параллельно с Mathematica, коллега мне рекомендовал Origin, который вроде бы заточен именно на графику.
В этом Origin я освоил построение графика функции одной и двух переменных, но на векторном поле зашел в тупик.
Если логика разработчиков графики в Mathematica является для меня недосягаемой, то логика Origin — вообще потусторонняя для меня.
Поэтому я уже боюсь — осваивать еще одну программу gnuplot для графики у меня уже терпения не хватит.
Хорошо, закончим на этом. Буду ждать, когда Mathcad реализует построение 3D векторных полей.
Векторный анализ и визуализация
В Языке Wolfram n-мерные вектора представляются в виде списков длиной n.
Out[1]= |
Для расчета векторного произведения необходимо ввести символ ESC cross ESC :
Векторы в вольфрам математика
- : x^a
- : Sqrt[x]
- : x^(1/n)
- : a^x
- : Log[a, x]
- : Log[x]
- : cos[x] или Cos[x]
- : sin[x] или Sin[x]
- : tan[x] или Tan[x]
- : cot[x] или Cot[x]
- : sec[x] или Sec[x]
- : csc[x] или Csc[x]
- : ArcCos[x]
- : ArcSin[x]
- : ArcTan[x]
- : ArcCot[x]
- : ArcSec[x]
- : ArcCsc[x]
- : cosh[x] или Cosh[x]
- : sinh[x] или Sinh[x]
- : tanh[x] или Tanh[x]
- : coth[x] или Coth[x]
- : sech[x] или Sech[x]
- : csch[x] или Csch[е]
- : ArcCosh[x]
- : ArcSinh[x]
- : ArcTanh[x]
- : ArcCoth[x]
- : ArcSech[x]
- : ArcCsch[x]
- [19.67] =19: integral part of (19.67) – выделяет целую часть числа (integerPart)
Решение уравнений
Чтобы получить решение уравнения вида достаточно записать в строке Wolfram|Alpha: f[x]=0, при этом Вы получите некоторую дополнительную информацию, которая генерируется автоматически. Если же Вам необходимо только решение, то необходимо ввести: Solve[f[x]=0, x].
Примеры
- Solve[Cos[x]+Cos[2x]+Sin[4x]=0,x] или Cos[x]+Cos[2x]+Sin[4x]=0;
- Solve[x^5+x^4+x+1=0,x] или x^5+x^4+x+1=0;
- Solve[Log[3,x^2+x+1]-Log[9,x^2]=0,x] или Log[3,x^2+x+1]-Log[9,x^2]=0.
Если Ваше уравнение содержит несколько переменных, то запись: f[x, y,…,z]=0 даст весьма разнообразный набор сведений, таких как решение в целых числах, частные производные функции и т. д. Чтобы получить решение уравнения вида по какой-либо одной из переменных, нужно написать в строке: Solve[f[x, y, …, z]=0, j], где — интересующая Вас переменная.
Примеры
- Cos[x+y]=0 или Solve[Cos[x+y]=0,x] или Solve[Cos[x+y]=0,y];
- x^2+y^2-5=0 или Solve[x^2+y^2-5=0,x] или Solve[x^2+y^2-5=0,y];
- x+y+z+t+p+q=9.
Решение неравенств
Решение в Wolfram Alpha неравенств типа 0″ src=”http://upload.wikimedia.org/math/3/d/9/3d97eb56e02c2889dd20a89529548180.png” />, полностью аналогично решению уравнения . Нужно написать в строке WolframAlpha: f[x]>0 или f[x]>=0 или Solve[f[x]>0, x] или Solve[f[x]>=0,x].
Примеры
- Cos[10x]-1/2>0 или Solve[Cos[10x]-1/2>0,x];
- x^2+5x+10>=0 или Solve[x^2+5x+10>=0,x].
Если Ваше неравенство содержит несколько переменных, то запись: f[x, y,…,z]>0 или f[x, y,…,z]>=0 даст весьма разнообразный набор сведений, как и в случае соответствующих уравнений. Чтобы получить решение такого неравенства по какой-либо одной из переменных нужно написать в строке: Solve[f[x, y,…,z]>0,j] или Solve[f[x, y,…,z]>=0,j], где — интересующая Вас переменная.
Примеры
- Cos[x+y]>0 или Solve[Cos[x+y]>0,x] или Solve[Cos[x+y]>0,y];
- x^2+y^3-5 =9.
Решение различных систем уравнений, неравенств и уравнений
Решение систем различного вида в Wolfram Alpha крайне просто. Достаточно набрать уравнения и неравенства Вашей системы, точно так, как это описано выше в пунктах 7. и 8., соединяя их союзом «И», который в Wolfram Alpha имеет вид &&.
Сервис Wolfram Alpha поддерживает возможность построения графиков функций как вида , так и вида . Для того, чтобы построить график функции на отрезке нужно написать в строке Wolfram Alpha: Plot[f[x],]. Если Вы хотите, чтобы диапазон изменения ординаты был конкретным, например , нужно ввести: Plot[f[x],,].
Если Вам требуется построить сразу несколько графиков на одном рисунке, то перечислите их, используя союз «И»:Plot[f[x]&&g[x]&&h[x]&&…&&t[x],].
Для того, чтобы построить график функции на прямоугольнике , нужно написать в строке Wolfram Alpha: Plot[f[x, y],,]. К сожалению, диапазон изменения аппликаты пока что нельзя сделать конкретным. Тем не менее, интересно отметить, что при построении графика функции Вы получите не только поверхность, которую она определяет, но и «контурную карту» поверхности (линии уровня).
Математический анализ
Wolfram Alpha способен находить пределы функций, последовательностей, различные производные, определенные и неопределенные интегралы, решать дифференциальные уравнения и их системы и многое многое другое.
Пределы
Для того, чтобы найти предел последовательности нужно написать в строке Wolfram Alpha: Limit[x_n, n -> Infinity].
Примеры
- Limit[n^3/(n^4 + 2*n), n -> Infinity];
- Limit[(1+1/n)^n, n -> Infinity].
Найти предел функции при можно совершенно аналогично: Limit[f[x], x -> a].
Производные
Для того, чтобы найти производную функции нужно написать в строке WolframAlpha: D[f[x], x]. Если Вам требуется найти производную n-го порядка, то следует написать: D[f[x], ]. В том случае, если Вам требуется найти частную производную функции напишите в окне гаджета: D[f[x, y, z,…,t], j], где — интересующая Вас переменная. Если нужно найти частную производную по некоторой переменной порядка n, то следует ввести: D[f[x, y, z,…,t], ], где означает тоже, что и Выше.
Важно подчеркнуть, что Wolfram Alpha выдает пошаговое нахождение производной при нажатии на «Show Steps» в правом верхнем углу выдаваемого ей ответа.
Интегралы
Для того, чтобы найти неопределенный интеграл от функции нужно написать в строке WolframAlpha: Integrate f[x], x. Найти определенный интеграл так же просто: Integrate[f[x], ] либо Integrate f(x), x=a..b.
Важно подчеркнуть, что Wolfram Alpha выдает пошаговое нахождение интеграла при нажатии на «Show Steps» в правом верхнем углу выдаваемого ей ответа.
Дифференциальные уравнения и их системы
Чтобы найти общее решение дифференциального уравнения нужно написать в строке WolframAlpha: F[x, y, y’,y”,…] (при k-й производной y ставится k штрихов).
Если Вам требуется решить задачу Коши, то впишите: F[x, y, y’,y”,…], y[s]==A,y'[s]==B, …. Если нужно получить решение краевой задачи, что краевые условия, так же перечисляются через запятую, причем они должны иметь вид y[s]==S.
Решение систем дифференциальных уравнений также просто, достаточно вписать: , где f_1, f_2, …, f_n — дифференциальные уравнения, входящие в систему. К сожалению, решение задач Коши и краевых задач для систем дифференциальных уравнений пока-что не поддерживается.
Ошибки при работе с системой
Система может допускать некоторые ошибки при решении сложных задач. К примеру, если попытаться решить неравенство , для чего ввести запрос solve (3x^2-18x+24)/(2x-2)-(3x-12)/(2x^2-6x+4) x 2 /3 – 3x + 12
factor x^2/3 – 3x + 12
и нажимаем равно (=).
Например, разложить на слагаемые
Partial fraction expansion(1-x^2)/(x^3+x)
используются формулы разложения функций в ряд Тейлора (Taylor series) и ряд Маклорена (Maclaurin series) или
Series expansion at x=0
Разложить в ряд Лорана:
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[f[x]]
Комплексно сопряженное z*
[spoiler title=”источники:”]
http://www.wolfram.com/language/fast-introduction-for-math-students/ru/vector-analysis-and-visualization/
http://www.reshim.su/index/0-84
[/spoiler]