LoginSignup
1
0

More than 1 year has passed since last update.

「3点を通る平面の式」をwolframalphaとSymPyとvbaでやってみた。

Last updated at Posted at 2021-09-29

SymPyのdefの使い方を教えて下さい。

オリジナル

wolframalphaで

方程式
z = -(11 x)/14 - (8 y)/7 + 15/14

SymPyで(2022-11-03追加)

これが、スッキリしていていいと思います。

from sympy import *
A=Point3D(1, 2,-2)
B=Point3D(3,-2, 1)
C=Point3D(5, 1,-4)
print("#",Plane(A,B,C))
print("#",Plane(A,B,C).equation())
# Plane(Point3D(1, 2, -2), (11, 16, 14))
# 11*x + 16*y + 14*z - 15

subs使用

from sympy import *
var('Ax Ay Az')
var('Bx By Bz')
var('Cx Cy Cz')
A=Point3D(Ax,Ay,Az)
B=Point3D(Bx,By,Bz)
C=Point3D(Cx,Cy,Cz)
print("#",Plane(A,B,C))
print("#",Plane(A,B,C).equation())
mySubs={Ax:1,Ay:2,Az:-2,Bx:3,By:-2,Bz:1,Cx:5,Cy:1,Cz:-4}
print("#",Plane(A,B,C).subs(mySubs))
print("#",Plane(A,B,C).equation().subs(mySubs))
# (省略)
# (省略)
# Plane(Point3D(1, 2, -2), (11, 16, 14))
# 11*x + 16*y + 14*z - 15

SymPyで(行列で)

from sympy import *
var('a b c d')
var('Ax Ay Az')
var('Bx By Bz')
var('Cx Cy Cz')
a=(By-Ay)*(Cz-Az)-(Cy-Ay)*(Bz-Az)
b=(Bz-Az)*(Cx-Ax)-(Cz-Az)*(Bx-Ax)
c=(Bx-Ax)*(Cy-Ay)-(Cx-Ax)*(By-Ay)
d=-(a*Ax+b*Ay+c*Az)
mySubs={Ax:1,Ay:2,Az:-2,Bx:3,By:-2,Bz:1,Cx:5,Cy:1,Cz:-4}
print("#",a.subs(mySubs),b.subs(mySubs),c.subs(mySubs),d.subs(mySubs))
# 11 16 14 -15

????defを使ってみました。

from sympy import *
var('a b c d')
var('Ax Ay Az')
var('Bx By Bz')
var('Cx Cy Cz')
var('x y z')
def myMat2Eq(myMat):
    a=(By-Ay)*(Cz-Az)-(Cy-Ay)*(Bz-Az)
    b=(Bz-Az)*(Cx-Ax)-(Cz-Az)*(Bx-Ax)
    c=(Bx-Ax)*(Cy-Ay)-(Cx-Ax)*(By-Ay)
    d=-(a*Ax+b*Ay+c*Az)
    mySubs={Ax:myMat[0,0],Ay:myMat[0,1],Az:myMat[0,2],
            Bx:myMat[1,0],By:myMat[1,1],Bz:myMat[1,2],
            Cx:myMat[2,0],Cy:myMat[2,1],Cz:myMat[2,2]}
    return a.subs(mySubs)*x+b.subs(mySubs)*y+c.subs(mySubs)*z+d.subs(mySubs)
myMat=Matrix([[1,2,-2],[3,-2,1],[5,1,-4]])
print("#",myMat2Eq(myMat))
# 11*x + 16*y + 14*z - 15

vbaで

Sub heimenNOsiki()
    ActiveSheet.Cells.Clear
MsgBox "3点を含む平面の式を計算します。"
    Range("A1") = 1
    Range("B1") = 2
    Range("C1") = -2
    Range("A2") = 3
    Range("B2") = -2
    Range("C2") = 1
    Range("A3") = 5
    Range("B3") = 1
    Range("C3") = -4
    Range("A5").Formula = "=(B2-B1)*(C3-C1)-(B3-B1)*(C2-C1)"
    Range("B5").Formula = "=(C2-C1)*(A3-A1)-(C3-C1)*(A2-A1)"
    Range("C5").Formula = "=(A2-A1)*(B3-B1)-(A3-A1)*(B2-B1)"
    Range("D5").Formula = "=-(A5*A1+B5*B1+C5*C1)"
End Sub

'結果
'11  16  14  -15

参考

equation(x=None, y=None, z=None) 
The equation of the Plane.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0