среда, 2 января 2019 г.

Лунная Sonata

Год назад я описал свой проект по созданию программы для математических расчётов в Lua. За прошедшее время многое успело измениться. Во-первых, название проекта стало, на мой взгляд, более приятным. Во-вторых, сформировалась концепция: компактный и портативный инструмент для расчётов "на скорую руку". В третьих, проведён рефакторинг по принципу "долой всё лишнее". И, естественно, были добавлены новые возможности! О них и пойдёт речь далее.

суббота, 21 июля 2018 г.

Octave. Ускорение

Octave хоть и является аналогом Matlab, сильно уступает последнему в эффективности. Однако, иногда можно попытаться ускорить расчёт. Прежде всего, нужно помнить общее для всех языков (и компьютерных систем) правило: если что-то можно сделать несколькими способами, и один из них встроен в язык (систему), то следует выбрать именно этот способ. В Octave это относится к операциям над массивами. 

четверг, 14 июня 2018 г.

Python. Производные, интегралы и ОДУ

Если искомая функция является полиномом, для её дифференцирования и интегрирования можно использовать методы модуля numpy.polynomial.polynomial. Хочу обратить внимание, что самый левый коэффициент соответствует младшему члену полинома, правый - старшему. Функции polyder() и polyint() содержат дополнительные опциональные коэффициенты, которые позволяют использовать их более гибко.



воскресенье, 10 июня 2018 г.

Python. Символные вычисления

Если ввести в поисковике запрос "символьные вычисления в python", большинство результатов будут посвящены модулю SymPy. Это действительно мощный инструмент, описание работы с которым можно найти, например, здесь. Я же ограничусь кратким рассмотрением некоторых из возможностей данного модуля. 

понедельник, 4 июня 2018 г.

Python. Решение уравнений

Для решения системы линейных уравнений типа Ax = b в numpy имеется функция linalg.solve(). Они принимает на вход квадратную матрицу линейно-независимых строк A, а также вектор значений b, и рассчитывает вектор корней x. Для проверки результата в данном примере использована функция allclose(), она сравнивает два массива поэлементно и возвращает True, если разница не превышает заданной величины (по-умолчанию относительная разность не более 1E-5, абсолютная - 1E-8).


Если найти решение не удалось, можно попробовать функцию linalg.lstsq(), которая ищет такой вектор x, для которого евклидова норма разности между Ax и b будет минимальна.

вторник, 22 мая 2018 г.

Python. Графики

В качестве инструмента построения графиков рассмотрим библиотеку matplotlib и её модуль pyplot. Он предназначен для работы с двумерными фигурами и умеет строить большое число разнообразных типов графиков, обеспечивая при этом Matlab-подобный интерфейс. Простейший график можно создать с помощью следующих команд.
  import numpy as np
  import matplotlib.pyplot as plt 
  # векторы абсцисс и ординат
  X = np.linspace(0, 2*np.pi, 50)
  Y = np.sin(X)

  # создание графика и его отображение
  plt.plot(X,Y) 
  plt.show()
Как видно, отрисовка происходит через обращение к модулю pyplot (plt). График строит функция plot(), а отображает - show().

четверг, 17 мая 2018 г.

Python. Массивы

В принципе, массивы в Python можно построить за счёт комбинации списков, однако при больших размерах массива данное решение неэффективно, т.к. работать будет сравнительно медленно, а памяти потребует много. К тому же, все специальные операции придётся задавать вручную. Для решения данных проблем был создан модуль NumPy.