Вычислить расходимость произвольного вектора с помощью SymPy - PullRequest
0 голосов
/ 12 мая 2018

В данный момент я пытаюсь закодировать модуль, который может различать произвольные измерения вектора.Чтобы быть точным, это на самом деле оператор дивергенции для вектора n-измерений.Это мой код

from sympy import *
q = int(input("State your vector dimensions: "))
n = q+1 

def divergence(f):
"""
Divergence operator for n-dimensions vector
Please write the vector in form of an array
Please use en to indicate dimension
ie: [10*e1+5e*2, 5*e3-10*e2, 45*e3]
"""

    w = symbols ('e1:%d'%n)
    a0 = diff(f[0], w[0])

Мне нужен код для автоматического создания n-номеров функций diff (которые я импортирую из SymPy).Поэтому, когда бы я ни указывал свои векторные размеры, этот модуль дивергенции будет давать n-число diff функций и автоматически дифференцировать их соответственно своим размерам.Это должно быть что-то вроде этого.Допустим, мой вектор состоит из 5 измерений (которые я установил из входных данных).Затем я напишу f в виде массива с len (f) = 5. Мой код должен автоматически генерироваться примерно так:

def divergence(f):
    w = symbols ('e1:%d'%n)
    a0 = diff(f[0], w[0])
    a1 = diff(f[1], w[1])
    a2 = diff(f[2], w[2])
    a3 = diff(f[3], w[3])
    a1 = diff(f[4], w[4])
    return a1 + a2 + a3 + a4 + a5

И всякий раз, когда я устанавливаю новый вход, код автоматически изменится соответственно на вход.Как мне этого добиться?

Причина, по которой я пишу

w = symbols ('e1:%d'%n)

вместо `

w = symbols ('e0:%d'%n)

, заключается лишь в том, что на самом деле принято указывать размеры вектораот е1, а не е0.

Я действительно новичок в SymPy и никогда раньше не изучал символьные вычисления.Все ли базовые свойства NumPy также есть в SymPy (например, array и cos)?

1 Ответ

0 голосов
/ 12 мая 2018

Функция вычисления дивергенции нуждается в двух вещах: список векторных компонентов и список переменных, в которых можно их дифференцировать. Без списка переменных смысл дивергенции неясен: например, учитывая вектор [t*s, t-s], как узнать, следует ли дифференцировать первый компонент по t или s? При вводе [vector], [variable] функция будет такой:

def divergence(f, x):
    return sum(fi.diff(xi) for fi, xi in zip(f, x))

который работает так

t, s = symbols('t s')
f = [t*s, t-s]
divergence(f, [t, s])   # s-1

В сторону: SymPy и NumPy - это очень разные библиотеки. В SymPy нет методов векторизации NumPy. При работе с SymPy вы хотите использовать списки или кортежи, а не массивы NumPy. У SymPy есть математические функции, такие как «cos», но они являются собственными функциями, а не NumPy. Функции SymPy работают с объектами SymPy, а функции NumPy работают с объектами NumPy.

...