LoginSignup
0
0

「 高校数学の「ベクトルの内積」関連の問題をPythonで解く 」を参考に、値を最後に代入してみた。

Last updated at Posted at 2021-11-21

オリジナル

sympyで

問題1 内積と、それらがなす角 θ

from sympy import *
import sympy
var('ax ay bx by')
a = sympy.Matrix([ax, ay])
b = sympy.Matrix([bx, by])
ab = a.dot(b)
theta = sympy.acos(a.dot(b)/(a.norm()*b.norm()))
myValue={ax:2, ay:-3,bx:-4,by:6}
print(f'# 問題1(1)の解答 内積は {ab} 、角度θは {theta}')
print(f'# 問題1(1)の解答 内積は {ab.subs(myValue)}、角度θは {theta.subs(myValue)}')
from sympy import *
import sympy
var('ax ay bx by')
a = sympy.Matrix([ax, ay])
b = sympy.Matrix([bx, by])
ab = a.dot(b)
theta = sympy.acos(sympy.simplify(a.dot(b)/(a.norm()*b.norm())))
myValue={ax:1, ay:1,bx:1-sympy.sqrt(3), by:1+sympy.sqrt(3)}
print(f'# 問題1(2)の解答 内積は {ab} 、角度θは {theta}')
print(f'# 問題1(2)の解答 内積は {ab.subs(myValue)}、角度θは {theta.subs(myValue).simplify()}')
# 問題1(1)の解答 内積は ax*bx + ay*by 、角度θは acos((ax*bx + ay*by)/(sqrt(Abs(ax)**2 + Abs(ay)**2)*sqrt(Abs(bx)**2 + Abs(by)**2)))
# 問題1(1)の解答 内積は -26、角度θは pi
# 問題1(2)の解答 内積は ax*bx + ay*by 、角度θは acos((ax*bx + ay*by)/(sqrt(Abs(ax)**2 + Abs(ay)**2)*sqrt(Abs(bx)**2 + Abs(by)**2)))
# 問題1(2)の解答 内積は 2、角度θは pi/3

問題2 平行四辺形の面積

from sympy import *
import sympy
var('ax ay bx by')
a = sympy.Matrix([ax, ay])
b = sympy.Matrix([bx, by])
S = sympy.sqrt(a.norm()**2 * b.norm()**2 - a.dot(b)**2)
S = sympy.simplify(S)
myValue={ax:1, ay:1,bx:1-sympy.sqrt(3), by:1+sympy.sqrt(3)}
print(f'# 問題2の解答 面積は {S}')
print(f'# 問題2の解答 面積は {S.subs(myValue).simplify()}')
# 問題2の解答 面積は sqrt(-(ax*bx + ay*by)**2 + (Abs(ax)**2 + Abs(ay)**2)*(Abs(bx)**2 + Abs(by)**2))
# 問題2の解答 面積は 2*sqrt(3)

問題3 垂直な単位ベクトル

別解は、sympy2Dで

from sympy import *
import sympy
x, y = sympy.symbols('x y')
var('ax ay')
a = sympy.Matrix([ax,ay])
u = sympy.Matrix([x,y])
u_norm = sympy.sqrt(x**2+y**2)
sol = sympy.solve([a.dot(u),u_norm-1],[x,y])
myValue={ax:3,ay:4}
print("# 問題3の解答",sol)
print("# 問題3の解答",[[ans.subs(myValue) for ans in sol[i]] for i in range(len(sol))])

from sympy import *
def myMatrixtoList(myMatrix):
    return [[ans for ans in myMatrix] for i in range(len(myMatrix)-1)]
def myPoint2DtoMatrix(myPoint2D):
    return Matrix([myPoint2D.x,myPoint2D.y])
def myUnitVector(myPoint):
    myL=myPoint.distance((0, 0))
    return Point2D(myPoint.x/myL,myPoint.y/myL)
var('ax ay')
print("# 問題3の別解",myMatrixtoList( myUnitVector(Point2D(ax,ay).rotate(pi/2))),
                     myMatrixtoList(-myUnitVector(Point2D(ax,ay).rotate(pi/2))))
myValue={ax:3,ay:4}
print("# 問題3の別解",myMatrixtoList( myUnitVector(Point2D(ax,ay).rotate(pi/2)).subs(myValue)),
                     myMatrixtoList(-myUnitVector(Point2D(ax,ay).rotate(pi/2)).subs(myValue)))
# 問題3の解答 [(-ay*sqrt(1/(ax**2 + ay**2)), ax*sqrt(1/(ax**2 + ay**2))), (ay*sqrt(1/(ax**2 + ay**2)), -ax*sqrt(1/(ax**2 + ay**2)))]
# 問題3の解答 [[-4/5, 3/5], [4/5, -3/5]]
# 問題3の別解 [[-ay/sqrt(ax**2 + ay**2), ax/sqrt(ax**2 + ay**2)]] [[ay/sqrt(ax**2 + ay**2), -ax/sqrt(ax**2 + ay**2)]]
# 問題3の別解 [[-4/5, 3/5]] [[4/5, -3/5]]

問題4 直線の方程式

別解は、sympy2Dで

from sympy import *
import sympy
var('ax ay')
c1, c2 = sympy.symbols('c1 c2')
a = sympy.Matrix([ax, ay])
u = sympy.Matrix([c1, c2])
u_norm = sympy.sqrt(c1**2+c2**2)
sol = sympy.solve([a.dot(u),u_norm-1],[c1,c2])
c1 = sol[0][0]
c2 = sol[0][1]
x, y = sympy.symbols('x y')
ans = sympy.solve((x-3)/c1 - (y-2)/c2, y)
myValue={ax:3,ay:4}
print(f'# 問題4の解答 直線の式は y = {ans[0]}')
print(f'# 問題4の解答 直線の式は y = {ans[0].subs(myValue)}')

from sympy import *
import sympy
var('x y')
var('ax ay')
c1, c2 = sympy.symbols('c1 c2')
a = Point([ax, ay])
u = Point([c1, c2])
l_eq=solve(Line(u,u+a.rotate(pi/2)).equation(x=x, y=y),y)[0]
myValue={ax:3,ay:4,c1:3, c2:2}
print(f'# 問題4の別解 直線の式は y = {l_eq}')
print(f'# 問題4の別解 直線の式は y = {l_eq.subs(myValue)}')
# 問題4の解答 直線の式は y = (-ax*x + 3*ax + 2*ay)/ay
# 問題4の解答 直線の式は y = 17/4 - 3*x/4
# 問題4の別解 直線の式は y = (ax*c1 - ax*x + ay*c2)/ay
# 問題4の別解 直線の式は y = 17/4 - 3*x/4

参考

問題3の別解 垂直な単位ベクトル

問題4の別解 直線の方程式

いつもの? sympyの実行環境と 参考のおすすめです。

(テンプレート)

0
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
0
0