import numpy as np
import matplotlib.pyplot as plt
# Graph A: r^2 = 4cos(2theta)
theta_a = np.linspace(-np.pi/4, np.pi/4, 500)
theta_a = np.concatenate((theta_a, np.linspace(3*np.pi/4, 5*np.pi/4, 500)))
r_a_pos = 2 * np.sqrt(np.cos(2 * theta_a))
r_a_neg = -2 * np.sqrt(np.cos(2 * theta_a))
# Graph B: r^2 = sin(2theta)
theta_b = np.linspace(0, np.pi/2, 500)
theta_b = np.concatenate((theta_b, np.linspace(np.pi, 3*np.pi/2, 500)))
# Ensure sin(2*theta_b) is non-negative for sqrt
sin_2theta_b = np.sin(2 * theta_b)
valid_indices_b = sin_2theta_b >= 0
r_b_pos = np.full_like(theta_b, np.nan)
r_b_neg = np.full_like(theta_b, np.nan)
r_b_pos[valid_indices_b] = np.sqrt(sin_2theta_b[valid_indices_b])
r_b_neg[valid_indices_b] = -np.sqrt(sin_2theta_b[valid_indices_b])
# Graph C: r = 2cos(3theta/2)
theta_c = np.linspace(0, 4 * np.pi, 500)
r_c = 2 * np.cos(3 * theta_c / 2)
# Graph D: r^2 * theta = 1 => r = +/- 1/sqrt(theta)
theta_d = np.linspace(0.01, 4 * np.pi, 500) # theta > 0
r_d_pos = 1 / np.sqrt(theta_d)
r_d_neg = -1 / np.sqrt(theta_d)
# Graph E: r = 1 + 2cos(2theta)
theta_e = np.linspace(0, 2 * np.pi, 500)
r_e = 1 + 2 * np.cos(2 * theta_e)
# Graph F: r = 1 + 2cos(theta/2)
theta_f = np.linspace(0, 4 * np.pi, 500)
r_f = 1 + 2 * np.cos(theta_f / 2)
# Plotting
fig, axs = plt.subplots(2, 3, subplot_kw={'projection': 'polar'}, figsize=(15, 10))
fig.suptitle('Graphs of Polar Equations', fontsize=16)
# A
axs[0, 0].plot(theta_a, r_a_pos, color='blue')
axs[0, 0].plot(theta_a, r_a_neg, color='blue')
axs[0, 0].set_title(r'A. $r^2 = 4\cos(2\theta)$', fontsize=10)
axs[0, 0].set_rticks([-2, -1, 0, 1, 2])
# B
axs[0, 1].plot(theta_b, r_b_pos, color='red')
axs[0, 1].plot(theta_b, r_b_neg, color='red')
axs[0, 1].set_title(r'B. $r^2 = \sin(2\theta)$', fontsize=10)
axs[0, 1].set_rticks([-1, -0.5, 0, 0.5, 1])
# C
axs[0, 2].plot(theta_c, r_c, color='green')
axs[0, 2].set_title(r'C. $r = 2\cos(3\theta/2)$', fontsize=10)
# D
axs[1, 0].plot(theta_d, r_d_pos, color='purple')
axs[1, 0].plot(theta_d, r_d_neg, color='purple')
axs[1, 0].set_title(r'D. $r^2\theta = 1$', fontsize=10)
axs[1, 0].set_rlim(-5,5)
# E
axs[1, 1].plot(theta_e, r_e, color='orange')
axs[1, 1].set_title(r'E. $r = 1+2\cos(2\theta)$', fontsize=10)
# F
axs[1, 2].plot(theta_f, r_f, color='brown')
axs[1, 2].set_title(r'F. $r = 1+2\cos(\theta/2)$', fontsize=10)
for ax_row in axs:
for ax in ax_row:
ax.grid(True)
ax.set_theta_zero_location("N") # North
ax.set_theta_direction(-1) # Clockwise
plt.tight_layout(rect=[0, 0, 1, 0.96]) # Adjust layout to make space for suptitle
plt.show()
aW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKCiMgR3JhcGggQTogcl4yID0gNGNvcygydGhldGEpCnRoZXRhX2EgPSBucC5saW5zcGFjZSgtbnAucGkvNCwgbnAucGkvNCwgNTAwKQp0aGV0YV9hID0gbnAuY29uY2F0ZW5hdGUoKHRoZXRhX2EsIG5wLmxpbnNwYWNlKDMqbnAucGkvNCwgNSpucC5waS80LCA1MDApKSkKcl9hX3BvcyA9IDIgKiBucC5zcXJ0KG5wLmNvcygyICogdGhldGFfYSkpCnJfYV9uZWcgPSAtMiAqIG5wLnNxcnQobnAuY29zKDIgKiB0aGV0YV9hKSkKCiMgR3JhcGggQjogcl4yID0gc2luKDJ0aGV0YSkKdGhldGFfYiA9IG5wLmxpbnNwYWNlKDAsIG5wLnBpLzIsIDUwMCkKdGhldGFfYiA9IG5wLmNvbmNhdGVuYXRlKCh0aGV0YV9iLCBucC5saW5zcGFjZShucC5waSwgMypucC5waS8yLCA1MDApKSkKIyBFbnN1cmUgc2luKDIqdGhldGFfYikgaXMgbm9uLW5lZ2F0aXZlIGZvciBzcXJ0CnNpbl8ydGhldGFfYiA9IG5wLnNpbigyICogdGhldGFfYikKdmFsaWRfaW5kaWNlc19iID0gc2luXzJ0aGV0YV9iID49IDAKcl9iX3BvcyA9IG5wLmZ1bGxfbGlrZSh0aGV0YV9iLCBucC5uYW4pCnJfYl9uZWcgPSBucC5mdWxsX2xpa2UodGhldGFfYiwgbnAubmFuKQpyX2JfcG9zW3ZhbGlkX2luZGljZXNfYl0gPSBucC5zcXJ0KHNpbl8ydGhldGFfYlt2YWxpZF9pbmRpY2VzX2JdKQpyX2JfbmVnW3ZhbGlkX2luZGljZXNfYl0gPSAtbnAuc3FydChzaW5fMnRoZXRhX2JbdmFsaWRfaW5kaWNlc19iXSkKCgojIEdyYXBoIEM6IHIgPSAyY29zKDN0aGV0YS8yKQp0aGV0YV9jID0gbnAubGluc3BhY2UoMCwgNCAqIG5wLnBpLCA1MDApCnJfYyA9IDIgKiBucC5jb3MoMyAqIHRoZXRhX2MgLyAyKQoKIyBHcmFwaCBEOiByXjIgKiB0aGV0YSA9IDEgID0+IHIgPSArLy0gMS9zcXJ0KHRoZXRhKQp0aGV0YV9kID0gbnAubGluc3BhY2UoMC4wMSwgNCAqIG5wLnBpLCA1MDApICMgdGhldGEgPiAwCnJfZF9wb3MgPSAxIC8gbnAuc3FydCh0aGV0YV9kKQpyX2RfbmVnID0gLTEgLyBucC5zcXJ0KHRoZXRhX2QpCgojIEdyYXBoIEU6IHIgPSAxICsgMmNvcygydGhldGEpCnRoZXRhX2UgPSBucC5saW5zcGFjZSgwLCAyICogbnAucGksIDUwMCkKcl9lID0gMSArIDIgKiBucC5jb3MoMiAqIHRoZXRhX2UpCgojIEdyYXBoIEY6IHIgPSAxICsgMmNvcyh0aGV0YS8yKQp0aGV0YV9mID0gbnAubGluc3BhY2UoMCwgNCAqIG5wLnBpLCA1MDApCnJfZiA9IDEgKyAyICogbnAuY29zKHRoZXRhX2YgLyAyKQoKIyBQbG90dGluZwpmaWcsIGF4cyA9IHBsdC5zdWJwbG90cygyLCAzLCBzdWJwbG90X2t3PXsncHJvamVjdGlvbic6ICdwb2xhcid9LCBmaWdzaXplPSgxNSwgMTApKQpmaWcuc3VwdGl0bGUoJ0dyYXBocyBvZiBQb2xhciBFcXVhdGlvbnMnLCBmb250c2l6ZT0xNikKCiMgQQpheHNbMCwgMF0ucGxvdCh0aGV0YV9hLCByX2FfcG9zLCBjb2xvcj0nYmx1ZScpCmF4c1swLCAwXS5wbG90KHRoZXRhX2EsIHJfYV9uZWcsIGNvbG9yPSdibHVlJykKYXhzWzAsIDBdLnNldF90aXRsZShyJ0EuICRyXjIgPSA0XGNvcygyXHRoZXRhKSQnLCBmb250c2l6ZT0xMCkKYXhzWzAsIDBdLnNldF9ydGlja3MoWy0yLCAtMSwgMCwgMSwgMl0pCgojIEIKYXhzWzAsIDFdLnBsb3QodGhldGFfYiwgcl9iX3BvcywgY29sb3I9J3JlZCcpCmF4c1swLCAxXS5wbG90KHRoZXRhX2IsIHJfYl9uZWcsIGNvbG9yPSdyZWQnKQpheHNbMCwgMV0uc2V0X3RpdGxlKHInQi4gJHJeMiA9IFxzaW4oMlx0aGV0YSkkJywgZm9udHNpemU9MTApCmF4c1swLCAxXS5zZXRfcnRpY2tzKFstMSwgLTAuNSwgMCwgMC41LCAxXSkKCgojIEMKYXhzWzAsIDJdLnBsb3QodGhldGFfYywgcl9jLCBjb2xvcj0nZ3JlZW4nKQpheHNbMCwgMl0uc2V0X3RpdGxlKHInQy4gJHIgPSAyXGNvcygzXHRoZXRhLzIpJCcsIGZvbnRzaXplPTEwKQoKIyBECmF4c1sxLCAwXS5wbG90KHRoZXRhX2QsIHJfZF9wb3MsIGNvbG9yPSdwdXJwbGUnKQpheHNbMSwgMF0ucGxvdCh0aGV0YV9kLCByX2RfbmVnLCBjb2xvcj0ncHVycGxlJykKYXhzWzEsIDBdLnNldF90aXRsZShyJ0QuICRyXjJcdGhldGEgPSAxJCcsIGZvbnRzaXplPTEwKQpheHNbMSwgMF0uc2V0X3JsaW0oLTUsNSkKCgojIEUKYXhzWzEsIDFdLnBsb3QodGhldGFfZSwgcl9lLCBjb2xvcj0nb3JhbmdlJykKYXhzWzEsIDFdLnNldF90aXRsZShyJ0UuICRyID0gMSsyXGNvcygyXHRoZXRhKSQnLCBmb250c2l6ZT0xMCkKCiMgRgpheHNbMSwgMl0ucGxvdCh0aGV0YV9mLCByX2YsIGNvbG9yPSdicm93bicpCmF4c1sxLCAyXS5zZXRfdGl0bGUocidGLiAkciA9IDErMlxjb3MoXHRoZXRhLzIpJCcsIGZvbnRzaXplPTEwKQoKZm9yIGF4X3JvdyBpbiBheHM6CiAgICBmb3IgYXggaW4gYXhfcm93OgogICAgICAgIGF4LmdyaWQoVHJ1ZSkKICAgICAgICBheC5zZXRfdGhldGFfemVyb19sb2NhdGlvbigiTiIpICMgTm9ydGgKICAgICAgICBheC5zZXRfdGhldGFfZGlyZWN0aW9uKC0xKSAjIENsb2Nrd2lzZQoKcGx0LnRpZ2h0X2xheW91dChyZWN0PVswLCAwLCAxLCAwLjk2XSkgIyBBZGp1c3QgbGF5b3V0IHRvIG1ha2Ugc3BhY2UgZm9yIHN1cHRpdGxlCnBsdC5zaG93KCk=