Skip to content

Commit 2abf161

Browse files
authored
Add files via upload
1 parent 04cd4a5 commit 2abf161

File tree

1 file changed

+205
-0
lines changed

1 file changed

+205
-0
lines changed

linAlgVis.py

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
import matplotlib.pyplot as plt
2+
import numpy as np
3+
import numpy
4+
def linearCombo(a, b, c):
5+
'''This function is for visualizing linear combination of standard basis in 3D.
6+
Function syntax: linearCombo(a, b, c), where a, b, c are the scalar multiplier,
7+
also the elements of the vector.
8+
'''
9+
fig = plt.figure(figsize = (10,10))
10+
ax = fig.add_subplot(projection='3d')
11+
12+
######################## Standard basis and Scalar Multiplid Vectors#########################
13+
vec = np.array([[[0, 0, 0, 1, 0, 0]], # e1
14+
[[0, 0, 0, 0, 1, 0]], # e2
15+
[[0, 0, 0, 0, 0, 1]], # e3
16+
[[0, 0, 0, a, 0, 0]], # a* e1
17+
[[0, 0, 0, 0, b, 0]], # b* e2
18+
[[0, 0, 0, 0, 0, c]], # c* e3
19+
[[0, 0, 0, a, b, c]]]) # ae1 + be2 + ce3
20+
colors = ['b','b','b','r','r','r','g']
21+
for i in range(vec.shape[0]):
22+
X, Y, Z, U, V, W = zip(*vec[i,:,:])
23+
ax.quiver(X, Y, Z, U, V, W, length=1, normalize=False,
24+
color = colors[i] ,arrow_length_ratio = .08, pivot = 'tail',
25+
linestyles = 'solid',linewidths = 3, alpha =.6)
26+
27+
#################################Plot Rectangle Boxes##############################
28+
dlines = np.array([[[a, 0, 0],[a, b, 0]],
29+
[[0, b, 0],[a, b, 0]],
30+
[[0, 0, c],[a, b, c]],
31+
[[0, 0, c],[a, 0, c]],
32+
[[a, 0, c],[a, b, c]],
33+
[[0, 0, c],[0, b, c]],
34+
[[0, b, c],[a, b, c]],
35+
[[a, 0, 0],[a, 0, c]],
36+
[[0, b, 0],[0, b, c]],
37+
[[a, b, 0],[a, b, c]]])
38+
colors = ['k','k','g','k','k','k','k','k','k']
39+
for i in range(dlines.shape[0]):
40+
ax.plot(dlines[i,:,0], dlines[i,:,1], dlines[i,:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
41+
42+
#################################Annotation########################################
43+
ax.text(x = a, y = b, z = c, s= ' $(%0.d, %0.d, %.0d)$'% (a, b, c), size = 18)
44+
ax.text(x = a, y = 0, z = 0, s= ' $%0.d e_1 = (%0.d, 0, 0)$'% (a, a), size = 15)
45+
ax.text(x = 0, y = b, z = 0, s= ' $%0.d e_2 = (0, %0.d, 0)$'% (b, b), size = 15)
46+
ax.text(x = 0, y = 0, z = c, s= ' $%0.d e_3 = (0, 0, %0.d)$' %(c, c), size = 15)
47+
48+
#################################Axis Setting######################################
49+
ax.grid()
50+
ax.set_xlim([0, a+1])
51+
ax.set_ylim([0, b+1])
52+
ax.set_zlim([0, c+1])
53+
54+
ax.set_xlabel('x-axis', size = 18)
55+
ax.set_ylabel('y-axis', size = 18)
56+
ax.set_zlabel('z-axis', size = 18)
57+
58+
ax.set_title('Vector $(%0.d, %0.d, %.0d)$ Visualization' %(a, b, c), size = 20)
59+
60+
ax.view_init(elev=20., azim=15)
61+
62+
if __name__ == '__main__':
63+
a = 7
64+
b = 4
65+
c = 9
66+
linearCombo(a, b, c)
67+
68+
def linearComboNonStd(a, b, c, vec1, vec2, vec3):
69+
'''This function is for visualizing linear combination of non-standard basis in 3D.
70+
Function syntax: linearCombo(a, b, c, vec1, vec2, vec3), where a, b, c are the scalar multiplier,
71+
ve1, vec2 and vec3 are the basis.
72+
'''
73+
fig = plt.figure(figsize = (10,10))
74+
ax = fig.add_subplot(projection='3d')
75+
########################Plot basis##############################
76+
vec1 = np.array([[0, 0, 0, vec1[0], vec1[1], vec1[2]]])
77+
X, Y, Z, U, V, W = zip(*vec1)
78+
ax.quiver(X, Y, Z, U, V, W, length=1, normalize=False, color = 'blue',arrow_length_ratio = .08, pivot = 'tail',
79+
linestyles = 'solid',linewidths = 3)
80+
81+
vec2 = np.array([[0, 0, 0, vec2[0], vec2[1], vec2[2]]])
82+
X, Y, Z, U, V, W = zip(*vec2)
83+
ax.quiver(X, Y, Z, U, V, W, length=1, normalize=False, color = 'blue',arrow_length_ratio = .08, pivot = 'tail',
84+
linestyles = 'solid',linewidths = 3)
85+
86+
vec3 = np.array([[0, 0, 0, vec3[0], vec3[1], vec3[2]]])
87+
X, Y, Z, U, V, W = zip(*vec3)
88+
ax.quiver(X, Y, Z, U, V, W, length=1, normalize=False, color = 'blue',arrow_length_ratio = .08, pivot = 'tail',
89+
linestyles = 'solid',linewidths = 3)
90+
91+
###########################Plot Scalar Muliplied Vectors####################
92+
avec1 = a * vec1
93+
X, Y, Z, U, V, W = zip(*avec1)
94+
ax.quiver(X, Y, Z, U, V, W, length=1, normalize=False, color = 'red', alpha = .6,arrow_length_ratio = a/100, pivot = 'tail',
95+
linestyles = 'solid',linewidths = 3)
96+
97+
bvec2 = b * vec2
98+
X, Y, Z, U, V, W = zip(*bvec2)
99+
ax.quiver(X, Y, Z, U, V, W, length=1, normalize=False, color = 'red', alpha = .6,arrow_length_ratio = b/100, pivot = 'tail',
100+
linestyles = 'solid',linewidths = 3)
101+
102+
cvec3 = c * vec3
103+
X, Y, Z, U, V, W = zip(*cvec3)
104+
ax.quiver(X, Y, Z, U, V, W, length=1, normalize=False, color = 'red', alpha = .6,arrow_length_ratio = c/100, pivot = 'tail',
105+
linestyles = 'solid',linewidths = 3)
106+
107+
combo = avec1 + bvec2 + cvec3
108+
X, Y, Z, U, V, W = zip(*combo)
109+
ax.quiver(X, Y, Z, U, V, W, length=1, normalize=False, color = 'green', alpha = .7,arrow_length_ratio = np.linalg.norm(combo)/300, pivot = 'tail',
110+
linestyles = 'solid',linewidths = 3)
111+
112+
#################################Plot Rectangle Boxes##############################
113+
point1 = [avec1[0, 3], avec1[0, 4], avec1[0, 5]]
114+
point2 = [avec1[0, 3]+bvec2[0, 3], avec1[0, 4]+bvec2[0, 4], avec1[0, 5]+bvec2[0, 5]]
115+
line1 = np.array([point1, point2])
116+
ax.plot(line1[:,0], line1[:,1], line1[:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
117+
118+
point1 = [bvec2[0, 3], bvec2[0, 4], bvec2[0, 5]]
119+
point2 = [avec1[0, 3]+bvec2[0, 3], avec1[0, 4]+bvec2[0, 4], avec1[0, 5]+bvec2[0, 5]]
120+
line1 = np.array([point1, point2])
121+
ax.plot(line1[:,0], line1[:,1], line1[:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
122+
123+
point1 = [bvec2[0, 3], bvec2[0, 4], bvec2[0, 5]]
124+
point2 = [cvec3[0, 3]+bvec2[0, 3], cvec3[0, 4]+bvec2[0, 4], cvec3[0, 5]+bvec2[0, 5]]
125+
line1 = np.array([point1, point2])
126+
ax.plot(line1[:,0], line1[:,1], line1[:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
127+
128+
point1 = [cvec3[0, 3], cvec3[0, 4], cvec3[0, 5]]
129+
point2 = [cvec3[0, 3]+bvec2[0, 3], cvec3[0, 4]+bvec2[0, 4], cvec3[0, 5]+bvec2[0, 5]]
130+
line1 = np.array([point1, point2])
131+
ax.plot(line1[:,0], line1[:,1], line1[:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
132+
133+
point1 = [cvec3[0, 3], cvec3[0, 4], cvec3[0, 5]]
134+
point2 = [cvec3[0, 3]+avec1[0, 3], cvec3[0, 4]+avec1[0, 4], cvec3[0, 5]+avec1[0, 5]]
135+
line1 = np.array([point1, point2])
136+
ax.plot(line1[:,0], line1[:,1], line1[:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
137+
138+
point1 = [avec1[0, 3], avec1[0, 4], avec1[0, 5]]
139+
point2 = [cvec3[0, 3]+avec1[0, 3], cvec3[0, 4]+avec1[0, 4], cvec3[0, 5]+avec1[0, 5]]
140+
line1 = np.array([point1, point2])
141+
ax.plot(line1[:,0], line1[:,1], line1[:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
142+
143+
##
144+
point1 = [avec1[0, 3]+bvec2[0, 3]+cvec3[0, 3],
145+
avec1[0, 4]+bvec2[0, 4]+cvec3[0, 4],
146+
avec1[0, 5]+bvec2[0, 5]+cvec3[0, 5]]
147+
point2 = [cvec3[0, 3]+avec1[0, 3],
148+
cvec3[0, 4]+avec1[0, 4],
149+
cvec3[0, 5]+avec1[0, 5]]
150+
line1 = np.array([point1, point2])
151+
ax.plot(line1[:,0], line1[:,1], line1[:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
152+
153+
##
154+
point1 = [avec1[0, 3]+bvec2[0, 3]+cvec3[0, 3],
155+
avec1[0, 4]+bvec2[0, 4]+cvec3[0, 4],
156+
avec1[0, 5]+bvec2[0, 5]+cvec3[0, 5]]
157+
point2 = [cvec3[0, 3]+bvec2[0, 3],
158+
cvec3[0, 4]+bvec2[0, 4],
159+
cvec3[0, 5]+bvec2[0, 5]]
160+
line1 = np.array([point1, point2])
161+
ax.plot(line1[:,0], line1[:,1], line1[:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
162+
163+
##
164+
point1 = [avec1[0, 3]+bvec2[0, 3]+cvec3[0, 3],
165+
avec1[0, 4]+bvec2[0, 4]+cvec3[0, 4],
166+
avec1[0, 5]+bvec2[0, 5]+cvec3[0, 5]]
167+
point2 = [bvec2[0, 3]+avec1[0, 3],
168+
bvec2[0, 4]+avec1[0, 4],
169+
bvec2[0, 5]+avec1[0, 5]]
170+
line1 = np.array([point1, point2])
171+
ax.plot(line1[:,0], line1[:,1], line1[:,2], lw =3, ls = '--', color = 'black', alpha=0.5)
172+
#################################Annotation########################################
173+
ax.text(x = vec1[0,3], y = vec1[0,4], z = vec1[0,5], s= ' $v_1 =(%0.d, %0.d, %.0d)$'% (vec1[0,3], vec1[0,4], vec1[0,4]), size = 8)
174+
ax.text(x = vec2[0,3], y = vec2[0,4], z = vec2[0,5], s= ' $v_2 =(%0.d, %0.d, %.0d)$'% (vec2[0,3], vec2[0,4], vec2[0,4]), size = 8)
175+
ax.text(x = vec3[0,3], y = vec3[0,4], z = vec3[0,5], s= ' $v_3= (%0.d, %0.d, %.0d)$'% (vec3[0,3], vec3[0,4], vec3[0,4]), size = 8)
176+
177+
ax.text(x = avec1[0,3], y = avec1[0,4], z = avec1[0,5], s= ' $%.0d v_1 =(%0.d, %0.d, %.0d)$'% (a, avec1[0,3], avec1[0,4], avec1[0,4]), size = 8)
178+
ax.text(x = bvec2[0,3], y = bvec2[0,4], z = bvec2[0,5], s= ' $%.0d v_2 =(%0.d, %0.d, %.0d)$'% (b, bvec2[0,3], bvec2[0,4], bvec2[0,4]), size = 8)
179+
ax.text(x = cvec3[0,3], y = cvec3[0,4], z = cvec3[0,5], s= ' $%.0d v_3= (%0.d, %0.d, %.0d)$'% (c, cvec3[0,3], cvec3[0,4], cvec3[0,4]), size = 8)
180+
# ax.text(x = 0, y = b, z = 0, s= ' $%0.d e_2 = (0, %0.d, 0)$'% (b, b), size = 15)
181+
# ax.text(x = 0, y = 0, z = c, s= ' $%0.d e_3 = (0, 0, %0.d)$' %(c, c), size = 15)
182+
183+
#################################Axis Setting######################################
184+
ax.grid()
185+
ax.set_xlim([0, 15])
186+
ax.set_ylim([0, 15])
187+
ax.set_zlim([0, 15])
188+
189+
ax.set_xlabel('x-axis', size = 18)
190+
ax.set_ylabel('y-axis', size = 18)
191+
ax.set_zlabel('z-axis', size = 18)
192+
193+
#ax.set_title('Vector $(%0.d, %0.d, %.0d)$ Visualization' %(a, b, c), size = 20)
194+
195+
ax.view_init(elev=20., azim=15)
196+
197+
if __name__ == '__main__':
198+
a = 2
199+
b = 3
200+
c = 4
201+
vec1 = np.array([2,1,0])
202+
vec2 = np.array([0,3,1])
203+
vec3 = np.array([1,2,3])
204+
linearComboNonStd(a, b, c, vec1,vec2,vec3)
205+

0 commit comments

Comments
 (0)