Advertisement
Teammasik

laba_5_vm

Mar 3rd, 2023
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.97 KB | None | 0 0
  1. # z = (x1 + 1)^2 + x1x2 + (x1–3*x2)^2
  2. import random
  3.  
  4. precision = 0.0000000001
  5.  
  6.  
  7. def func(x1, x2):
  8.     return (x1 + 1) ** 2 + x1 * x2 + (x1 - 3 * x2) ** 2
  9.  
  10.  
  11. def derivative1(x1, x2):
  12.     # производная по 1 переменной
  13.     return 4 * x1 + 2 - 5 * x2
  14.     # 4 -5
  15.  
  16.  
  17. def derivative2(x1, x2):
  18.     # производная по 2 переменной
  19.     return 18 * x2 - 5 * x1
  20.     # -5 18
  21.  
  22.  
  23. def test(x1, x2):
  24.     # уравнение из примера
  25.     return (2*x1-5*x2)**2+(3*x1-15)**2
  26.  
  27.  
  28. def task1():
  29.     h = 0.01
  30.     x1 = -0.8
  31.     x2 = -0.3
  32.     n = 1000
  33.     f = func(x1, x2)
  34.     for i in range(1, n + 1):
  35.         while True:
  36.             f0 = f
  37.             x1 += h
  38.             f = func(x1, x2)
  39.             if f - f0 > 0:
  40.                 break
  41.  
  42.         while True:
  43.             f0 = f
  44.             x2 += h
  45.             f = func(x1, x2)
  46.             if f - f0 > 0:
  47.                 break
  48.  
  49.         if abs(h) < precision / 2:
  50.             break
  51.         else:
  52.             h -= h / 2
  53.     print("\nx1 = %s\nx2 = %s\nF = %s\niter: %d" % (x1, x2, f, i))
  54.  
  55.  
  56. # task1()
  57.  
  58.  
  59. def task2():
  60.     f = 1000
  61.     x1, x2, n, h = -1, -1, 1000, 0.01
  62.     for i in range(1, n):
  63.         x10, x20 = x1, x2
  64.         f0, f1, f2 = func(x1, x2), derivative1(x1, x2), derivative2(x1, x2)
  65.         while True:
  66.             f = func(x1, x2)
  67.             x1 -= h * f1
  68.             x2 -= h * f2
  69.             if func(x1, x2) > f:
  70.                 break
  71.         if ((x1 - x10) ** 2 + (x2 - x20) ** 2) ** 0.5 < precision * 10:
  72.             print(x1, x2, f, i)
  73.             break
  74.         if abs(func(x1, x2) - f0) < precision * 0.0000001:
  75.             print(x1, x2, f, i)
  76.             break
  77.  
  78.  
  79. # task2()
  80.  
  81.  
  82. def task3():
  83.     x1, x2, n = 1, 1, 1000
  84.     for i in range(1, n + 1):
  85.         x10, x20 = x1, x2
  86.         f0, f1, f2 = func(x1, x2), derivative1(x1, x2), derivative2(x1, x2)
  87.         while True:
  88.             h = 0.00005
  89.             x11, x21, a = x1, x2, 0
  90.             while True:
  91.                 a += h
  92.                 fa = func(x11, x21)
  93.                 x11 -= a * f1
  94.                 x21 -= a * f2
  95.                 fb = func(x11, x21)
  96.                 if fb >= fa:
  97.                     break
  98.             f = func(x1, x2)
  99.             x1 -= a * f1
  100.             x2 -= a * f2
  101.             if func(x1, x2) > f:
  102.                 break
  103.         if ((x1 - x10) ** 2 + (x2 - x20) ** 2) ** 0.5 < precision * 10:
  104.             print(x1, x2, f)
  105.             break
  106.         if abs(func(x1, x2) - f0) < precision * 0.000001:
  107.             print(x1, x2, f)
  108.             break
  109.  
  110.  
  111. # task3()
  112.  
  113.  
  114. def task4():
  115.     x1, x2, n, alpha, beta = 1, 1, 1000, 0.1, 0.5
  116.     for i in range(1, n + 1):
  117.         x10, x20 = x1, x2
  118.         f0, f1, f2 = func(x1, x2), derivative1(x1, x2), derivative2(x1, x2)
  119.         lmd = alpha
  120.         while True:
  121.             lmd *= beta
  122.             if func(x10 - lmd * f1, x20 - lmd * f2) < f0:
  123.                 break
  124.         while True:
  125.             f = func(x1, x2)
  126.             x1 -= lmd * f1
  127.             x2 -= lmd * f2
  128.             if func(x1, x2) < f:
  129.                 break
  130.         if ((x1 - x10) ** 2 + (x2 - x20) ** 2) ** 0.5 < precision * 10:
  131.             print(x1, x2, f)
  132.             break
  133.         if abs(func(x1, x2) - f0) < precision * 0.000001:
  134.             print(x1, x2, f)
  135.             break
  136.  
  137.  
  138. # task4()
  139.  
  140.  
  141. def task5():
  142.     x10, x20, alp, x1, x2 = 1, 1, 1, 1, 1
  143.     while True:
  144.         x1k = x1
  145.         x2k = x2
  146.         f, f1, f2 = func(x1, x2), derivative1(x1, x2), derivative2(x1, x2)
  147.         f11, f12, f21, f22 = 4, -5, -5, 18
  148.         delta = f11 * f22 - f12 * f21
  149.         delta1 = f1 * f22 - f2 * f12
  150.         delta2 = f11 * f2 - f21 * f1
  151.         dx1 = -delta1 / delta
  152.         dx2 = -delta2 / delta
  153.         x1 += alp * dx1
  154.         x2 += alp * dx2
  155.         dev = ((x1 - x1k)**2 + (x2 - x2k)**2)**0.5
  156.         if dev < precision:
  157.             break
  158.     print(x1, x2, f, f1, f2)
  159.  
  160.  
  161. # task5()
  162.  
  163.  
  164. def task6():
  165.     x1, x2, h, n = 10, 10, 0.01, 100
  166.     for i in range(1, n):
  167.         while True:
  168.             fa = func(x1, x2)
  169.             y = x1
  170.             y1 = y - h
  171.             y2 = y + h
  172.             f0, f1, f2 = func(y, x2), func(y1, x2), func(y2, x2)
  173.             x1 -= (h / 2) * (f2 - f1) / (f2 - 2 * f0 + f1)
  174.             if abs(x1 - y) < precision * 10000:
  175.                 break
  176.         while True:
  177.             y = x2
  178.             y1 = y - h
  179.             y2 = y + h
  180.             f0, f1, f2 = func(x1, y), func(x1, y1), func(x1, y2)
  181.             x2 -= (h / 2) * (f2 - f1) / (f2 - 2 * f0 + f1)
  182.             if abs(x2 - y) < precision * 10000:
  183.                 break
  184.         fb = func(x1, x2)
  185.         if abs(fa - fb) < precision*0.0000001:
  186.             break
  187.     print(x1, x2, func(x1, x2), i)
  188.  
  189.  
  190. # task6()
  191.  
  192.  
  193. def task7():
  194.     x1, y1 = 0, 0
  195.     x, y = 0, 0
  196.     f = func(x, y)
  197.     f0 = f
  198.     # здесь я спецом беру такой цикл, желательно подобрать range под свой варик
  199.     # на 1000 делю чтобы закидывать дробные значения в функцию
  200.     for x in range(-1000, 0):
  201.         f = func(x/1000, y/1000)
  202.         if f < f0:
  203.             x1, y1, f0 = x, y, f
  204.         for y in range(-1000, 0):
  205.             f = func(x/1000, y/1000)
  206.             if f < f0:
  207.                 x1, y1, f0 = x, y, f
  208.     print(x1/1000, y1/1000, func(x1/1000, y1/1000))
  209.     # -0.766 -0.213 0.234043
  210.  
  211.  
  212. # task7()
  213.  
  214.  
  215. def task8():
  216.     n, xk, yk = 1000, 100, 100
  217.     x, y = 0, 0
  218.     x1, y1 = 0, 0
  219.     f = func(x, y)
  220.     f0 = f
  221.     for i in range(1, n):
  222.         rnd = random.randint(-8000, -2000) / 10000
  223.         print(rnd)
  224.         x = rnd
  225.         f = func(x, y)
  226.         if f < f0:
  227.             x1, y1, f0 = x, y, f
  228.         for j in range(1, n):
  229.             rnd = random.randint(-8000, -2000) / 10000
  230.             y = rnd
  231.             f = func(x, y)
  232.             if f < f0:
  233.                 x1, y1, f0 = x, y, f
  234.         if f0 < 0.0001:
  235.             break
  236.     print(x1, y1, f0)
  237.  
  238.  
  239. # task8()
  240.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement