Включение значений в sympy и numpy - PullRequest
0 голосов
/ 08 апреля 2020

Мне интересно, как я могу ввести значения в мою матрицу (J * f). В частности, мне нужно подключить значения из моей матрицы p => p [0,0] = значение x, p [0,1] = значение y, p [0,2] = значение z (это первая итерация, однако значения будут меняться после каждой итерации). Причина, по которой я делаю это, заключается в том, что мне нужно сделать al oop из 5 итераций.

p Начальная матрица выглядит так, но в столбце, а не в строке [0.1, 0.1, -0.1]

Как я могу go делать это?

import sympy as sp
import numpy as np


x, y, z = sp.symbols("x y z")


eq1 = 3*x - sp.cos(y*z) - 1/2
eq2 = x**2 -81*(y+0.1)**2 + sp.sin(z) + 1.06
eq3 = sp.exp(-x*y) + 20*z + (10*sp.pi - 3)/3

A = np.array([[0,0,x],[0,0,0],[0,0,0]])

f = np.array([[eq1],[eq2],[eq3]])

A[0,0] = sp.diff(eq1,x)
A[1,0] = sp.diff(eq1,y)
A[2,0] = sp.diff(eq1,z)
A[0,1] = sp.diff(eq2,x)
A[1,1] = sp.diff(eq2,y)
A[2,1] = sp.diff(eq2,z)
A[0,2] = sp.diff(eq3,x)
A[1,2] = sp.diff(eq3,y)
A[2,2] = sp.diff(eq3,z)


J = sp.Matrix(A).inv()

p = np.array([[0.1], [0.1], [-0.1]])

p = p - J*f 
i = 0
for i in range(0,4):
    p = p - J*f 
    i += 1
print(p)

1 Ответ

0 голосов
/ 08 апреля 2020

Использование Matrix(A) из моего ответа на предыдущий вопрос:

In [23]: As                                                                                            
Out[23]: 
⎡                               -x⋅y⎤
⎢    3            2⋅x       -y⋅ℯ    ⎥
⎢                                   ⎥
⎢                               -x⋅y⎥
⎢z⋅sin(y⋅z)  -162⋅y - 16.2  -x⋅ℯ    ⎥
⎢                                   ⎥
⎣y⋅sin(y⋅z)     cos(z)         20   ⎦

Использование subs для замены x,y,z числами:

In [24]: As.subs({x:0.1, y:0.1, z:-0.1})                                                               
Out[24]: 
⎡          3                   0.2         -0.0990049833749168⎤
⎢                                                             ⎥
⎢0.000999983333416667         -32.4        -0.0990049833749168⎥
⎢                                                             ⎥
⎣-0.000999983333416667  0.995004165278026          20         ⎦

и получение симпита inv:

In [25]: _.inv()                                                                                       
Out[25]: 
⎡ 0.333333183973692   0.0021086068381224    0.0016605204461288  ⎤
⎢                                                               ⎥
⎢1.0238518631053e-5   -0.0308688255197139  -0.000152757694650781⎥
⎢                                                               ⎥
⎣1.61570129882115e-5  0.00153583592705254   0.0500076827517613  ⎦

То же самое, если я сделаю subs на J=As.inv():

In [26]: J.subs({x:0.1, y:0.1, z:-0.1})                                                                
Out[26]: 
⎡ 0.333333183973692   0.0021086068381224    0.0016605204461288  ⎤
⎢                                                               ⎥
⎢1.0238518631053e-5   -0.0308688255197139  -0.000152757694650782⎥
⎢                                                               ⎥
⎣1.61570129882115e-5  0.00153583592705254   0.0500076827517613  ⎦

J*f все еще матрица симпати (J симпози, f is ndarray), поэтому sub работает здесь так:

In [27]: (J*f).subs({x:0.1, y:0.1, z:-0.1})                                                            
Out[27]: 
⎡-0.39071797440964 ⎤
⎢                  ⎥
⎢0.0687621665029634⎥
⎢                  ⎥
⎣0.419660799608434 ⎦

(если, вероятно, было бы лучше, если бы f была матрицей sympy, но, как я уже отмечал ранее, иногда объекты sympy в массиве dtype объекта работают .)

(я делаю эти вычисления в сеансе isympy.)

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