импорт numpy как np из scipy.special импорт hyp2f1 , gamma импорт matplotlib.pyplot как pltdef schwarz_sp ( alpha , beta , gam ): """Значения карты треугольника Шварца в точке 1 и бесконечности. Аргументы: alpha, beta, gamma: Равны числу пи, умноженному на угол треугольника. Возвращает: s1: Значение карты треугольника Шварца в точке z=1. sinf: Значение карты треугольника Шварца в точке z=бесконечность. a, b, c, ap, bp, cp: Параметры гипергеометрических функций. """ a = ( 1 - alpha - beta - gam ) / 2 b = ( 1 - alpha + beta - gam ) / 2 c = 1 - alpha ap = ( 1 + alpha - beta - gam ) / 2 # a - c + 1 bp = ( 1 + alpha + beta - gam ) / 2 # b - c + 1 cp = 1 + alpha # 2-c palpha = np.pi * alpha gfact = gamma ( 2 - c ) / ( gamma ( 1 - a ) * gamma ( c ) ) s1 = gamma ( c - a ) * gamma ( c - b ) / gamma ( 1 - b ) * gfact sinf = np.exp ( 1j * palpha ) * gamma ( b ) * gamma ( c - a ) * gfact / gamma ( b - c + 1 ) вернуть s1 , sinf , a , b , c , ap , bp , cp def schwarz ( альфа , бета , гамма , z ) : s1 , sinf , a , b , c , ap , bp , cp = schwarz_sp ( альфа , бета , гамма ) результат = z ** альфа * hyp2f1 ( ap , bp , cp , z ) / hyp2f1 ( a , b , c , z ) результат [ np.isinf ( z ) ] = sinf возврат результата n = 20 x = np.linspace ( -n , n , 20 * n + 1 ) y = np.arange ( 1,2 * n + 1 ) [:, np.newaxis ] grid_hor = ( x + 1j * y ) .T x = np.arange ( -n , n + 1 ) y = np.linspace ( 0,2 * n , 20 * n + 1 ) [ :, np.newaxis ] grid_vert = x + 1j * y grid = np.concatenate ( [ grid_hor , grid_vert ] , axis = 1 ) # ребра , противоположные углам beta и gamma, являются просто прямыми линиями, # поэтому мы можем пропустить точки на этой линии [ от -inf до 1] # и сосредоточиться на ребре , противоположном alpha [ от 1 до inf]. # интервал выбирается произвольно, чтобы он выглядел гладким border = np . concatenate ([ np . linspace ( 0 , 1 ) ** 10 + 1 , np . logspace ( 1 , 10 , base = 2 ), [ np . inf , - 3 , 0 , 1 ]]) + 0 j # для заполнения части около s(inf), где линии сетки # становятся настолько близкими друг к другу, что они просто становятся черными cap = np . concatenate ([ np . logspace ( np . log2 ( n ), 10 , base = 2 ), [ np . inf , - n ]]) + 0 jfig , axes = plt.subplots ( nrows = 2 , ncols = 2 , figsize = ( 8 , 8 ) ) для ax в axes.flat : ax.axis ( ' equal ' ) ax = axes [ 0 , 0 ] ax.set_title ( ' Верхняя полуплоскость ' ) ax.plot ( grid.real , grid.imag , color = ' k ' ) ax.plot ( boundary.real , border.imag , color = ' b ' ) ax.fill ( [ - 10 , 10 , 10 , -10 ] , [ 0 , 0 , 10 , 10 ] , color = ' lightgrey ' ) ax.set_xlim ( -2 , 2 ) ax .set_ylim ( - 1 , 4 ) params = [( 1 / 2 , 1 / 2 , 1 / 3 ), ( 1 / 3 , 1 / 3 , 1 / 3 ), ( 1 / 4 , 1 / 10 , 1 / 3 )] titles = [ 'α = 1/2, β = 1/2, γ = 1/3' , 'α = β = γ = 1/3' , 'α = 1/4, β = 1/10, γ = 1/3' ] для ax , a , t в zip ([ оси [ 0 , 1 ], оси [ 1 , 0 ], оси [ 1 , 1 ]], параметры , заголовки ): g = schwarz ( a [ 0 ], a [ 1 ], a [ 2 ], сетка ) b = schwarz ( a [ 0 ] , a [ 1 ] , a [ 2 ] , boundary ) ax.plot ( g.real , g.imag , color = ' k ' ) ax.plot ( b.real , b . imag , цвет = 'b ' , zorder = 10 ) ax.fill ( b.real , b.imag , цвет = ' lightgrey ' ) c = schwarz ( a [ 0 ] , a [ 1 ] , a [ 2 ] , cap ) ax.fill ( c.real , c.imag , цвет = 'k' ) ax . set_title ( t )рис . сохранить рис ( 'черный треугольник function.svg' , bbox_inches = 'tight' )