mitkonikov

Biljana

Apr 5th, 2023
776
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.30 KB | None | 0 0
  1. import numpy as np
  2. from math import cos, sin, sqrt
  3. from random import randint
  4.  
  5. def f_squared(t, u, v, p1, p2, p3):
  6.     # Computes the squared area of the triangle
  7.     # defined by p1(t), p2(u), and p3(v)
  8.     # with circle radii r1, r2, and r3
  9.     a = np.linalg.norm(np.cross(p2(u), p3(v)))
  10.     b = np.linalg.norm(np.cross(p3(v), p1(t)))
  11.     c = np.linalg.norm(np.cross(p1(t), p2(u)))
  12.     s = (a + b + c) / 2
  13.     area_squared = s * (s - a) * (s - b) * (s - c)
  14.     return area_squared
  15.  
  16. def grad_f_squared(t, u, v, p1, p2, p3):
  17.     # Computes the gradient of -f^2 at (t, u, v)
  18.     # with circle radii r1, r2, and r3
  19.     grad = np.zeros(3)
  20.     grad[0] = 0.5 * np.dot(p1(t) - p2(u), np.cross(p2(u), p3(v)))[0] / f_squared(t, u, v, p1, p2, p3)
  21.     grad[1] = 0.5 * np.dot(p2(u) - p3(v), np.cross(p3(v), p1(t)))[0] / f_squared(t, u, v, p1, p2, p3)
  22.     grad[2] = 0.5 * np.dot(p3(v) - p1(t), np.cross(p1(t), p2(u)))[0] / f_squared(t, u, v, p1, p2, p3)
  23.     return -2 * grad
  24.  
  25. def steepest_descent(p1, p2, p3, epsilon=1e-2, max_iter=100, step_size=0.05):
  26.     # Performs steepest descent to find the minimum value of -f^2
  27.     # with circle radii r1, r2, and r3
  28.     # Returns the optimal (t, u, v) values and the corresponding minimum value
  29.     t, u, v = 0.0, 0.0, 0.0
  30.     t, u, v = randint(0, 628) / 100, randint(0, 628) / 100, randint(0, 628) / 100
  31.     for i in range(max_iter):
  32.         grad = grad_f_squared(t, u, v, p1, p2, p3)
  33.         if np.linalg.norm(grad) < epsilon:
  34.             break
  35.         t -= step_size * grad[0]
  36.         u -= step_size * grad[1]
  37.         v -= step_size * grad[2]
  38.     return (t, u, v), abs(-f_squared(t, u, v, p1, p2, p3))
  39.  
  40. K = [[3, 4, 2], [0, 0, 1], [-3, 3, 1.5]]
  41.  
  42. def p1(t):
  43.     return np.array([K[0][0] + K[0][2] * cos(t), K[0][1] + K[0][2] * sin(t)])
  44. def p2(t):
  45.     return np.array([K[1][0] + K[1][2] * cos(t), K[1][1] + K[1][2] * sin(t)])
  46. def p3(t):
  47.     return np.array([K[2][0] + K[2][2] * cos(t), K[2][1] + K[2][2] * sin(t)])
  48.  
  49. best_sol = None
  50. best_area = 0
  51. for i in range(100):
  52.     sol, area = steepest_descent(p1, p2, p3)
  53.     print("Area: ", sqrt(area))
  54.     print(p1(sol[0]), p2(sol[1]), p3(sol[2]))
  55.     if area > best_area:
  56.         best_area = area
  57.         best_sol = sol
  58.  
  59. print("Best Area: ", sqrt(best_area))
  60. print(p1(best_sol[0]), p2(best_sol[1]), p3(best_sol[2]))
  61.  
Advertisement
Add Comment
Please, Sign In to add comment