# вставляем этот код в конец VectorFieldPlot 3.3 R = 0.6 h = 0.6 rsym = 21doc = FieldplotDocument ( 'VFPt_dipoles_electric1' , commons = True , width = 360 , height = 360 ) field = Field ([ [ 'диполь' , { 'x' : 0 , 'y' : 0 , 'px' : 0. , 'py' : 1. }] ])def f_arrows ( xy ): вернуть xy [ 1 ] * ( sc . hypot ( xy [ 0 ], xy [ 1 ]) / 1.4 - 1 ) def f_cond ( xy ): return hypot ( * xy ) > 1e-4 and ( fabs ( xy [ 1 ]) < 1e-3 или fabs ( xy [ 1 ]) > . 3 )nlines = 19 начальных точек = Начальный путь ( поле , лямбда t : 0,25 * sc . массив ([ sin ( t ), cos ( t )]), t0 = - pi / 2 , t1 = pi / 2 ) . npoints ( nlines ) для p0 в начальных точках : line = FieldLine ( field , p0 , direction = 'both' ) doc . draw_line ( линия , maxdist = 1 , arrow_style = { 'at_potentials' : [ 0. ], ' Potentials ' : f_arrows , 'condition_func' : f_cond , 'scale' : 1.2 })# рисуем символ диполя rb_grad = etree . Подэлемент ( док . _Get_defs (), 'linearGradient' ) rb_grad . set ( 'id' , 'gradient_rb' ) для attr , val in [[ 'x1' , '0' ], [ 'x2' , '0' ], [ 'y1' , '0' ], [ 'y2' , '1' ]]: rb_grad . Набор ( атр , вал ) для седловине , из в [[ '# 3355ff' , '0' ], [ '# 9944aa' , '0,5' ], [ '# FF0000' , '1' ]]: остановка = etree . Подэлемент ( rb_grad , 'stop' ) stop . set ( 'stop-color' , col ) стоп . set ( 'смещение' , of ) stop . set ( 'стоп-непрозрачность' , '1' ) symb = doc . draw_object ( 'g' , { 'id' : 'dipole_symbol' , 'transform' : 'scale ( {0} , {0} )' . format ( 1. / doc . unit )}) док . draw_object ( 'circle' , { 'cx' : '0' , 'cy' : '0' , 'r' : rsym , 'fill' : 'url (#grad_rb)' , 'stroke' : 'none' }, группа = симв ) док . _check_whitespot () док . draw_object ( 'circle' , { 'cx' : '0' , 'cy' : '0' , 'r' : rsym , 'fill' : 'url (#white_spot)' , 'stroke' : '# 000000' , 'stroke-width' : '3' }, group = symb ) док . draw_object ( 'path' , { 'fill' : '# 000000' , 'stroke' : 'none' , 'd' : 'M 3, -12 V 0 H 12 L 0,15 L -12,0 H -3 V -12 H 3 Z ' }, группа = симв ) док . написать ()doc = FieldplotDocument ( 'VFPt_dipoles_electric2' , commons = True , width = 360 , height = 360 ) field = Field ([ [ 'monopole' , { 'x' : 0 , 'y' : h , 'Q' : 1 }] , [ 'монополь' , { 'x' : 0 , 'y' : - h , 'Q' : - 1 }] ])def f_arrows ( xy ): return xy [ 1 ] * ( sc . hypot ( xy [ 0 ], xy [ 1 ]) / 1.4 - 1 ) def f_cond ( xy ): return fabs ( xy [ 0 ]) < 1.4nlines = 18 stp = Startpath ( поле , лямбда t : R * sc . array ([ . 2 * sin ( t ), 1 +. 2 * cos ( t )]), t0 = - pi , t1 = pi ) startpoints = [ stp . startpos ( s ) для s в sc . arange ( nlines ) / float ( nlines )] начальные точки . append ( startpoints [ nlines // 2 ] . dot ([[ 1 , 0 ], [ 0 , - 1 ]])) для p0 в начальных точках : line = FieldLine ( field , p0 , direction = 'both' , maxr = 100 ) док . draw_line ( линия , maxdist = 1 , arrow_style = { 'at_potentials' : [ 0. ], ' Potentials ' : f_arrows , 'condition_func' : f_cond , 'scale' : 1.2 })# рисуем символы заряда symb_plus = doc . draw_object ( 'g' , { 'transform' : 'translate (0, {0} ) scale ( {1} , {1} )' . format ( h , 1. / doc . unit )}) symb_minus = doc . draw_object ( 'g' , { 'transform' : 'translate (0, {0} ) scale ( {1} , {1} )' . format ( - h , 1. / doc . unit )}) для i , g в перечислении ([ symb_plus , symb_minus ]): док . draw_object ( 'окружность' , { 'cx' : '0' , 'cy' : '0' , 'r' : rsym , 'stroke' : 'none' , 'fill' : [ '# ff0000' , '# 3355ff ' ] [ i ]}, группа = g ) док . _check_whitespot () док . draw_object ( 'circle' , { 'cx' : '0' , 'cy' : '0' , 'r' : rsym , 'fill' : 'url (#white_spot)' , 'stroke' : '# 000000' , 'stroke-width' : '3' }, group = g ) c_symb = doc . draw_object ( 'path' , { 'fill' : '# 000000' , 'stroke' : 'none' }, group = g ), если i == 0 : # знак плюса c_symb . set ( 'd' , 'M 3,3 V 12 H -3 V 3 H -12 V -3' + 'H -3 V -12 H 3 V -3 H 12 V 3 H 3 Z' ) else : # знак минус c_symb . set ( 'd' , 'M 12,3 H -12 V -3 H 12 V 3 Z' ) док . написать ()doc = FieldplotDocument ( 'VFPt_dipoles_electric3' , commons = True , width = 360 , height = 360 ) field = Field ([ [ 'ringcurrent' , { 'x' : 0 , 'y' : 0 , 'R' : R , ' phi ' : pi / 2 , ' I ' : 1. }] ])def f_arrows ( xy ): вернуть xy [ 1 ] * ( sc . hypot ( xy [ 0 ], xy [ 1 ]) / 1.4 - 1 ) def f_cond ( xy ): return hypot ( * xy ) > 1.2 * R and fabs ( fabs ( xy [ 0 ]) - 1,4 ) > 0,2nlines = 19 начальных точек = Начальный путь ( поле , лямбда t : sc . массив ([ R * t , 0. ]), t0 = - 0,9375 , t1 = 0,9375 ) . npoints ( nlines ) для p0 в начальных точках : line = FieldLine ( field , p0 , direction = 'both' ) doc . draw_line ( линия , maxdist = 1 , arrow_style = { 'at_potentials' : [ 0. ], ' Potentials ' : f_arrows , 'condition_func' : f_cond , 'scale' : 1.2 })# рисовать поляризованный лист Sheet = doc . draw_object ( 'g' , { 'id' : 'polarized_sheet' }) s = 0,06 док . draw_object ( 'rect' , { 'x' : - R , 'y' : - s , 'width' : 2 * R , 'height' : 2 * s , 'обводка' : 'none' , 'fill' : ' # 3355ff ' }, group = sheet ) док . draw_object ( 'rect' , { 'x' : - R , 'y' : 0 , 'width' : 2 * R , 'height' : s , 'stroke' : 'none' , 'fill' : '# ff0000' }, group = sheet ) grad = doc . draw_object ( 'linearGradient' , { 'id' : 'grad-round' , 'x1' : str ( R ), 'x2' : str ( - R ), 'y1' : '0' , 'y2' : '0 ' , ' gradientUnits ' : ' userSpaceOnUse ' }, group = doc . defs ) для o , c , a in (( 0 , ' # 000 ' , 0.3 ), ( 0.3 , ' # 999 ' , 0.2 ), ( 0.8 , '#fff' , 0,25 ), ( 1 , '#fff' , 0,65 )): док . draw_object ( 'stop' , { 'id' : 'grad' , 'offset' : str ( o ), 'stop-color' : c , 'stop-opacity' : str ( a )}, grad ) док . draw_object ( 'rect' , { 'x' : - R , 'y' : - s , 'width' : 2 * R , 'height' : 2 * s , 'stroke' : '# 000000' , 'ширина обводки ' : 0.03 , ' fill ' : ' url (# grad-round) ' , ' stroke-linejoin ' : ' round ' }, group = sheet )symbols_plus = [] symbols_minus = [] для x в сбн . linspace ( - R * 0,875 , R * 0,875 , 16 ): symbols_minus . append ( 'M {: .3f} , 0 h 0,03' . формат ( x - 0,015 )) symbols_plus . append ( 'M {: .3f} , 0 h 0,03 M {: .3f} , -0,015 v 0,03' . format ( x - 0,015 , x )) док . draw_object ( 'path' , { 'd' : '' . join ( symbols_plus ), 'stroke' : '# 000000' , 'fill' : 'none' , 'stroke-width' : 0,01 , 'stroke-linecap' : 'butt' , 'transform' : 'translate (0,0.025)' }, group = sheet ) doc . draw_object ( 'path' , { 'd' : '' . join ( symbols_minus ), 'stroke' : '# 000000' , 'fill' : 'none' , 'stroke-width' : 0,01 , 'stroke-linecap' : 'butt' , 'transform' : 'translate (0, -0.025)' }, group = sheet ) doc . написать ()doc = FieldplotDocument ( 'VFPt_dipoles_electric4' , commons = True , width = 360 , height = 360 ) field_D = Field ([ [ 'coil' , { 'x' : 0 , 'y' : 0 , 'phi' : pi / 2 , 'R' : R , 'Lhalf' : h , 'I' : 1. / ( R ** 2 * pi )}] ]) field_E = Поле ([ [ 'loaded_disc' , { 'x0' : - R , 'x1' : Р , 'у0' : ч , 'у1' : ч , 'Q' : . 5 / ч }], [ 'charged_disc' , { 'х0' : - R , 'x1' : R , «у0 ' : - h , ' y1 ' : - h , ' Q ' : -. 5 / h }] ]) field_E_inside = Field ([ [ ' однородный ' , { ' Fx ' : 0. , ' Fy ' : -. 5 / ( h * R ** 2 * pi )}], [ 'катушка' , { 'x' : 0 , 'y' : 0 , 'phi' : pi / 2 , 'R' : R , 'Lhalf' : h , 'I' : 1. / ( R ** 2 * pi )}] ])def f_arrows ( xy ): вернуть xy [ 1 ] * ( sc . hypot ( xy [ 0 ], xy [ 1 ]) / 1.4 - 1 ) def f_cond ( xy ): вернуть True# Используйте линии поля в D-поле, чтобы найти хорошие начальные точки nlines = 13 startpoints = [] startpoints2 = [] для iline в диапазоне ( nlines ): p0 = sc . array ([ R * ( - 1. + 2. * ( iline + 0.5 ) / nlines ), 0. ]) print ( 'p0' , p0 ) line_D = FieldLine ( field_D , p0 , direction = 'forward' , maxr = 100 , stop_funcs = 2 * [ лямбда xy : - xy [ 1 ] - max ( 0 , 1 - гипотеза ( * xy ) / R )]) p1 = line_D . узлы [ - 1 ] [ 'p' ] начальные точки . append ( p1 ), если iline > = 3 и iline < nlines - 3 : line_D = FieldLine ( field_D , p0 , direction = 'forward' , maxr = 2 , stop_funcs = 2 * [ лямбда xy : xy [ 1 ] - h ]) p2 = line_D . узлы [ - 1 ] [ 'p' ] начальные точки2 . добавить ( p2 ) начальные точки . добавить ([ 0 , - 3 ])для p0 в начальных точках : line = FieldLine ( field_E , p0 , direction = 'both' , maxr = 100 ) doc . draw_line ( line , maxdist = 1 , arrow_style = { 'at_potentials' : [ 0. ], ' Potentials ' : f_arrows , 'condition_func' : f_cond , 'scale' : 1.2 }) для p0 в начальных точках2 : line = FieldLine ( field_E_inside , p0 , direction = 'forward' , stop_funcs = 2 * [ лямбда xy : - xy [ 1 ] - h ]) док . draw_line ( линия , maxdist = 1 , arrow_style = { 'at_potentials' : [ 0. ], ' Potentials ' : f_arrows , 'condition_func' : f_cond , 'scale' : 1.2 })# рисуем заряженные диски disc_plus = doc . draw_object ( 'g' , { 'id' : 'disc_plus' , 'transform' : 'translate (0, {0} )' . format ( h )}) disc_minus = doc . draw_object ( 'g' , { 'id' : 'disc_minus' , 'transform' : 'translate (0, {0} )' . format ( - h )}) s = 0,045 grad = doc . draw_object ( 'linearGradient' , { 'id' : 'grad-round' , 'x1' : str ( R ), 'x2' : str ( - R ), 'y1' : '0' , 'y2' : '0 ' , ' gradientUnits ' : ' userSpaceOnUse ' }, group = doc . defs ) для o , c , a in (( 0 , ' # 000 ' , 0.3 ), ( 0.3 , ' # 999 ' , 0.2 ), ( 0.8 , '#fff' , 0,25 ), ( 1 , '#fff' , 0,65 )): док . draw_object ( 'stop' , { 'offset' : str ( o ), 'stop-color' : c , 'stop-opacity' : str ( a )}, grad ) для i , g в перечислении ([ disc_plus , disc_minus ] ): док . draw_object ( 'rect' , { 'x' : - R , 'y' : - s , 'width' : 2 * R , 'height' : 2 * s , 'stroke' : 'none' , 'fill' : [ '# ff0000' , '# 3355ff' ] [ i ]}, group = g ) док . draw_object ( 'rect' , { 'x' : - R , 'y' : - s , 'width' : 2 * R , 'height' : 2 * s , 'stroke' : '# 000000' , 'ширина обводки ' : 0,03 , ' fill ' : ' url (# grad-round) ' , ' stroke-linejoin ' : ' round ' }, group = g ) symbols = [] для x в [ R * ( 2 * ( 0,5 + isy ) / 11 - 1 ) для isy в диапазоне ( 11 )]: if i == 0 : d = 'M {: .3f} , 0 h 0,04 M {: .3f} , -0,02 v 0,04' . формат ( x - 0,02 , x ) иначе : d = 'M {: .3f} , 0 h 0,04' . формат ( x - 0,02 ) символов . добавить ( d ) док . draw_object ( 'path' , { 'd' : '' . join ( символы ), 'stroke' : '# 000000' , 'fill' : 'none' , 'stroke-width' : 0,01 , 'stroke-linecap' : 'butt' }, группа = g ) док . написать ()