Advertisement
F4ntomas

Informatics_and_prog_3.1

May 16th, 2022
805
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.18 KB | None | 0 0
  1. from cmath import asin
  2. import math
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. import sympy as sym
  6. from sympy.stats import Arcsin
  7. from scipy.optimize import minimize, minimize_scalar, fmin
  8. from sympy.sets import *
  9. from sympy.calculus.util import continuous_domain
  10. from sympy import Symbol, limit, S
  11. from sympy.functions import asin
  12.  
  13.  
  14.  
  15. def f(x) -> float:
  16.     """Функция"""
  17.     return np.arcsin((2*x)/(1+x**2))
  18.  
  19. # Постройка графика    
  20. fig, ax = plt.subplots()
  21. x = np.linspace(-50,50,100)
  22. # функция f(x) = arcsin(2x/1+x^2)
  23. y = np.arcsin((2*x)/(1+x**2))
  24. ax = ax.plot(x, y, "b-")
  25. ax = plt.gca()
  26. ax.spines['left'].set_position("center")
  27. ax.spines['bottom'].set_position('center')
  28. ax.spines['top'].set_visible(False)
  29. ax.spines['right'].set_visible(False)
  30. ax.set_xlabel("Y", fontsize=15, color='blue', labelpad=120) # +
  31. ax.set_ylabel("X", fontsize=15, color='orange', labelpad=140, rotation=0)
  32. plt.title('функция arcsin(2x/1+x^2)')
  33.  
  34. a: int = 0
  35. b: int = 0
  36. a = int(input('Введите границу интервала [a;b] a = '))
  37. b = int(input('Введите границу интервала [a;b] b = '))
  38.  
  39. fx = f
  40. # Нахождение минимума на заданном интервале
  41. # Дока на функцию: https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html#scipy.optimize.minimize_scalar
  42. min_x = minimize_scalar(fx, bounds=(a, b), method='bounded')
  43. print('Минимум функции:\nx =', min_x.x)
  44. print('y(x) =', min_x.fun)
  45.  
  46. # Нахождение maximyma на заданном интервале
  47. max_x = minimize_scalar(lambda x: -f(x), bounds=[a,b], method='bounded')
  48. print('\nМаксимум функции:\nx =', max_x.x)
  49. print('y(x) =', (-1)*max_x.fun)
  50.  
  51. z = Symbol('z')
  52. #print(continuous_domain(1/z, z, S.Reals)) остановился тут эту строчку УДАЛИТЬ
  53. # Возвращает интервалы в заданной области, для которых функция является непрерывной.
  54. # Дока https://docs.sympy.org/latest/modules/calculus/index.html#:~:text=sympy.calculus.util.continuous_domain(f%2C%20symbol%2C%20domain
  55. print('Функция непрерывна на интервале:', continuous_domain(asin((2*z)/(1+z*z)), z, Interval(a, b)))
  56.  
  57. #ylim = ax.get_ylim()
  58. #plt.hlines(0, -50, 50)
  59. z = Symbol('z')
  60. minus_inf = asin(limit((2*z)/(1+z*z), z, +sym.oo))
  61. plus_inf = asin(limit((2*z)/(1+z*z), z, -sym.oo))
  62. # Дока на теорию о асимптотах https://reshator.com/sprav/algebra/10-11-klass/asimptoty/
  63. # b = lim x -> +-inf (fx), b != inf
  64. if (minus_inf or plus_inf) == sym.oo:
  65.     print('Нет горизонтальных асимптот')
  66. else:
  67.     if minus_inf == plus_inf:
  68.         print('Горизонтальная асимптота =', minus_inf)
  69.     else:
  70.         print('Горизонтальные асимптоты =', minus_inf, plus_inf)
  71.  
  72.  
  73. # Eсли функция непрерывна на R, то вертикальные асимптоты отсутствуют
  74. # Проверим непрерывность функции на плоскости R
  75. vertical_asymptote = continuous_domain(asin((2*z)/(1+z*z)), z, S.Reals)
  76. # Чтобы сравнить два объекта класса пришлось создать примитивную функцию где функция непрерывна на R, чтобы сравнить
  77. for_func = continuous_domain(z+1, z, S.Reals)
  78. # Reals == Reals
  79. if vertical_asymptote == for_func:
  80.     print('Нет вертикальных асимптот')
  81.  
  82. # Найдем наклонную асимптоту
  83. # k = lim x->+-oo (fx/x), k != 0, k != oo      
  84. k = limit(asin(limit((2*z)/(1+z*z), z, sym.oo))/limit(z, z, +sym.oo), z, sym.oo)
  85. if (k == 0) or (k == sym.oo):
  86.     print(f'Поскольку угловой коэффициент наклонной асимптоты равен {k}, функция не имеет наклонной асимптоты')
  87. else:
  88.     b = (asin(limit((2*z)/(1+z*z), z, sym.oo)) - limit(k * z, z, sym.oo))
  89.     print(f'Наклонная асимптота y=kx + b: y={k}x + {b}')
  90.  
  91.  
  92. plt.show()
  93.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement