import numpy as np
import matplotlib.pyplot as plt
# --------------------------------------
# System of equations:
# 2x + 3y = 5
# 4x - y = 1
# --------------------------------------
A = np.array([[2, 3],
[4, -1]])
b = np.array([5, 1])
# Solve A x = b
x = np.linalg.solve(A, b)
x1, x2 = x
print("Solution:")
print(f"x = {x1:.4f}, y = {x2:.4f}")
# Extract column vectors
col1 = A[:, 0] # First column
col2 = A[:, 1] # Second column
# Scale columns by solution components
v1 = x1 * col1
v2 = x2 * col2
# Plotting
plt.figure(figsize=(7,7))
origin = np.array([[0, 0], [0, 0]])
# Plot x1 * col1 and x2 * col2
plt.quiver(*origin,
[v1[0], v2[0]],
[v1[1], v2[1]],
angles='xy', scale_units='xy', scale=1,
color=['black','black'])
# Plot resulting vector b
plt.quiver(0, 0, b[0], b[1],
angles='xy', scale_units='xy', scale=1,
width=0.006, color='blue')
# Annotate vectors
plt.text(v1[0], v1[1], " x·col1", fontsize=12)
plt.text(v2[0], v2[1], " y·col2", fontsize=12)
plt.text(b[0], b[1], " b", fontsize=12)
# Cosmetic settings
plt.xlim(-2, 8)
plt.ylim(-2, 8)
plt.grid(True)
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.title("Column Picture of a Linear System:\n x·col₁ + y·col₂ = b")
plt.show()
aW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBTeXN0ZW0gb2YgZXF1YXRpb25zOgojICAgMnggKyAzeSA9IDUKIyAgIDR4IC0gIHkgPSAxCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgPSBucC5hcnJheShbWzIsIDNdLAogICAgICAgICAgICAgIFs0LCAtMV1dKQoKYiA9IG5wLmFycmF5KFs1LCAxXSkKCiMgU29sdmUgQSB4ID0gYgp4ID0gbnAubGluYWxnLnNvbHZlKEEsIGIpCngxLCB4MiA9IHgKCnByaW50KCJTb2x1dGlvbjoiKQpwcmludChmInggPSB7eDE6LjRmfSwgICAgeSA9IHt4MjouNGZ9IikKCiMgRXh0cmFjdCBjb2x1bW4gdmVjdG9ycwpjb2wxID0gQVs6LCAwXSAgICMgRmlyc3QgY29sdW1uCmNvbDIgPSBBWzosIDFdICAgIyBTZWNvbmQgY29sdW1uCgojIFNjYWxlIGNvbHVtbnMgYnkgc29sdXRpb24gY29tcG9uZW50cwp2MSA9IHgxICogY29sMQp2MiA9IHgyICogY29sMgoKIyBQbG90dGluZwpwbHQuZmlndXJlKGZpZ3NpemU9KDcsNykpCgpvcmlnaW4gPSBucC5hcnJheShbWzAsIDBdLCBbMCwgMF1dKQoKIyBQbG90IHgxICogY29sMSBhbmQgeDIgKiBjb2wyCnBsdC5xdWl2ZXIoKm9yaWdpbiwKICAgICAgICAgICBbdjFbMF0sIHYyWzBdXSwKICAgICAgICAgICBbdjFbMV0sIHYyWzFdXSwKICAgICAgICAgICBhbmdsZXM9J3h5Jywgc2NhbGVfdW5pdHM9J3h5Jywgc2NhbGU9MSwKICAgICAgICAgICBjb2xvcj1bJ2JsYWNrJywnYmxhY2snXSkKCiMgUGxvdCByZXN1bHRpbmcgdmVjdG9yIGIKcGx0LnF1aXZlcigwLCAwLCBiWzBdLCBiWzFdLAogICAgICAgICAgIGFuZ2xlcz0neHknLCBzY2FsZV91bml0cz0neHknLCBzY2FsZT0xLAogICAgICAgICAgIHdpZHRoPTAuMDA2LCBjb2xvcj0nYmx1ZScpCgojIEFubm90YXRlIHZlY3RvcnMKcGx0LnRleHQodjFbMF0sIHYxWzFdLCAiICB4wrdjb2wxIiwgZm9udHNpemU9MTIpCnBsdC50ZXh0KHYyWzBdLCB2MlsxXSwgIiAgecK3Y29sMiIsIGZvbnRzaXplPTEyKQpwbHQudGV4dChiWzBdLCBiWzFdLCAgIiAgIGIiLCBmb250c2l6ZT0xMikKCiMgQ29zbWV0aWMgc2V0dGluZ3MKcGx0LnhsaW0oLTIsIDgpCnBsdC55bGltKC0yLCA4KQpwbHQuZ3JpZChUcnVlKQpwbHQuYXhobGluZSgwLCBjb2xvcj0nYmxhY2snLCBsaW5ld2lkdGg9MC41KQpwbHQuYXh2bGluZSgwLCBjb2xvcj0nYmxhY2snLCBsaW5ld2lkdGg9MC41KQpwbHQudGl0bGUoIkNvbHVtbiBQaWN0dXJlIG9mIGEgTGluZWFyIFN5c3RlbTpcbiB4wrdjb2zigoEgKyB5wrdjb2zigoIgPSBiIikKCnBsdC5zaG93KCkK