рдЬреВрд▓рд┐рдпрд╛: рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕-рдЬреИрд╕рд╛-рдлрд╝рдВрдХреНрд╢рдВрд╕

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде "рд╢рд╛рд╕реНрддреНрд░реАрдп" рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ, рднрд╛рд╖рд╛ рдЕрдореВрд░реНрдд рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рддрддреНрд╡реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦреЗрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕рдВрднрд╡рддрдГ рд▓рд┐рд╕реНрдк рдкрд░рд┐рд╡рд╛рд░ рдХреА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рд▓рд┐рд╕реНрдк -1 рд╢рд╛рдЦрд╛рдПрдВ), рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рддреАрди рд╕реНрддрд░реЛрдВ рдкрд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЙрдкрдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ, рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╕рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдЗрд╕ рдЕрдореВрд░реНрдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВред ред

рд╕реНрддрд░ 1. рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп


рдЙрдкрдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдХрд╛ рдЖрд╡рдВрдЯрди рдФрд░ рдЙрдирдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдкреНрд░рд╛рдЧреИрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд▓ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЬрдм рдлреЛрд░рдЯреНрд░рд╛рди рдХреЛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛, рдФрд░ рд╕реА рдЕрднреА рддрдХ рдирд╣реАрдВ рдерд╛ред

рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ, рдЬреВрд▓рд┐рдпрд╛ рдЙрддреНрдкрд╛рдж рдорд╛рдирдХ рд╣реИрдВред "рдлрд╝реАрдЪрд░" рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреЛрдИ рд╡рд┐рднрд╛рдЬрди рдирд╣реАрдВ рд╣реИред рднрд▓реЗ рд╣реА рд╕рдмрд░реВрдЯрд┐рди рдХреЛ рдХреБрдЫ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдП рдпрд╛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдкрд░ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреАрд╡рд░реНрдб function рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рддрд░реНрдХреЛрдВ рдХреА рд╕реВрдЪреА, рдХреЛрд╖реНрдардХ рдореЗрдВ рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдХреНрд░рдо рдФрд░ рд╢рдмреНрдж рдХрд╛ end рдкрд░рд┐рднрд╛рд╖рд╛ end рд╣реЛрддрд╛ рд╣реИ:

 """ sum_all(collection) Sum all elements of a collection and return the result """ function sum_all(collection) sum = 0 for item in collection sum += collection end sum end 

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд▓рд┐рд╕реНрдк рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓рд┐рдП рдЧрдП рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдорд╛рди рдХреЗ "рд╕рд╛рдорд╛рдиреНрдп" рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП, рд╢рдмреНрдж return рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ: рдЕрдВрддрд┐рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ end рдкрд╣рд▓реЗ рдХреА рдЬрд╛рддреА end ред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЪрд░ sum рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, return рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рд╢реЗрд╖ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 function safe_division(number, divisor) if divisor == 0 return 0 end number / divisor end #    function safe_division1(number, divisor) if divisor == 0 0 #             else number / divisor end end 

рдЫреЛрдЯреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЧрдгрд┐рддреАрдп рд╕рдВрдХреЗрддрди рдХреЗ рд╕рдорд╛рди рдЫреЛрдЯрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИред рддреЛ, рдкреИрд░реЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдХрд░реНрдг рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

 hypotenuse(a, b) = sqrt(a^2 + b^2) 

рдЯреЗрдиреЗрд░реА рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рд╕реБрд░рдХреНрд╖рд┐рдд" рдбрд┐рд╡реАрдЬрди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 safe_division(number, divisor) = divisor == 0 ? 0 : number / divisor 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдЬреЗрдЖрдИрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрддрдЦ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣рдореЗрд╢рд╛ рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдереА, рдЬреВрд▓рд┐рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрдирдкреБрдЯ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд░рд┐рдЯрд░реНрди рдкрд░рд┐рдгрд╛рдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, safe_division рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд╛рд╕реНрдЯ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╕рдВрд╢реЛрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:

 function safe_division(number, divisor) if divisor == 0 return zero(number / divisor) end number / divisor end 

рдЕрдм, рдпрджрд┐ рджреЛрдиреЛрдВ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рдХрд╛рд░ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ zero(x) рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдФрд░ IEEE 754 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдкрд░, рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдпреЛрдЧреНрдп рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ)ред

рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрдерд┐рддреАрдп рддрд░реНрдХ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддреАрдп рддрд░реНрдХ, рдирд╛рдорд╛рдВрдХрд┐рдд рддрд░реНрдХ рдФрд░ рддрд░реНрдХреЛрдВ рдХреА рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╡рд╛рдХреНрдп рд░рдЪрдирд╛:

 #    function hello(name) println("Hello, ", name) end #      #           function greeting_d(name, greeting = "Hello") println(greeting, ", ", name) end #       #          #       function greeting_kw(name; greeting = "Hello") println(greeting, ", ", name) end #  greeting   ,        function greeting_oblkw(name; greeting) println(greeting, ", ", name) end #      #  ,   ,      names function greeting_nary(greeting, names...) print(greeting) for name in names print(", ", name) end print('\n') end julia> hello("world") Hello, world julia> greeting_d("world") Hello, world julia> greeting_d("Mr. Smith", "How do you do") How do you do, Mr. Smith julia> greeting_kw("Mr. Smith") Hello, Mr. Smith julia> greeting_kw("mom", greeting = "Hi") Hi, mom julia> greeting_oblkw("world") ERROR: UndefKeywordError: keyword argument greeting not assigned Stacktrace: [1] greeting_oblkw(::String) at ./REPL[23]:3 [2] top-level scope at none:0 julia> greeting_oblkw("mom", greeting = "Hi") Hi, mom julia> greeting_nary("Hi", "mom", "dad", "everyone") Hi, mom, dad, everyone 

рд╕реНрддрд░ 2. рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп


рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 function f_x_x(fn, x) fn(x, x) end julia> f_x_x(+, 3) 6 # +(3, 3) = 3+3 = 6 julia> f_x_x(*, 3) 9 # *(3, 3) = 9 julia> f_x_x(^, 3) 27 # ^(3, 3) = 3^3 = 27 julia> f_x_x(log, 3) 1.0 # log(3, 3) = 1 

"рдХреНрд▓рд╛рд╕рд┐рдХ" рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрд░реНрдХ рд▓реЗрддреЗ рд╣реИрдВ, рд╡реЗ рд╣реИрдВ map , reduce рдФрд░ filter ред

map(f, x...) рд╕реЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдпрд╛ i-рддрддреНрд╡реЛрдВ рдХреЗ рдЯреНрдпреВрдкрд▓реНрд╕) рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдирдП рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

 julia> map(cos, [0, ╧А/3, ╧А/2, 2*╧А/3, ╧А]) 5-element Array{Float64,1}: 1.0 0.5000000000000001 6.123233995736766e-17 -0.4999999999999998 -1.0 julia> map(+, (2, 3), (1, 1)) (3, 4) 

reduce(f, x; init_val) "рдПрдХрд▓" рдХреЗ рд▓рд┐рдП "рдХрдо рдХрд░рддрд╛ рд╣реИ", рд╢реНрд░реГрдВрдЦрд▓рд╛ f(f(...f(f(init_val, x[1]), x[2])...), x[end]) :

 function myreduce(fn, values, init_val) accum = init_val for x in values accum = fn(accum, x) end accum end 

рдЪреВрдБрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХрдореА рдХреЗ рджреМрд░рд╛рди рд╕рд░рдгреА рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ fn(accum, x) , рдпрд╛ рдХреНрдпрд╛ fn(accum, x) рдпрд╛ fn(x, accum) , рдХрдореА рдХреЗрд╡рд▓ рдХрдореНрдпреВрдЯреЗрдЯрд┐рд╡ рдпрд╛ рд╕рд╣рдпреЛрдЧреА рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЧреА, рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╛ рдЧреБрдгрд╛ред

filter(predicate, x) x рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдзреЗрдп predicate рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ predicate :

 julia> filter(isodd, 1:10) 5-element Array{Int64,1}: 1 3 5 7 9 julia> filter(iszero, [[0], 1, 0.0, 1:-1, 0im]) 4-element Array{Any,1}: [0] 0.0 1:0 0 + 0im 

рд▓реВрдк рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ:

  1. рдХреЛрдб рдЫреЛрдЯрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ
  2. map() рдпрд╛ reduce() рдСрдкрд░реЗрд╢рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рд▓реВрдк рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛
  3. map() рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреВрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рд╕реНрддрд░ 3. рд╕рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп


рдЕрдХреНрд╕рд░ map() рдпрд╛ filter() рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдирд╛рдо рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреВрд▓рд┐рдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд┐рдП рдмрд┐рдирд╛, рддрд░реНрдХ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдореВрд░реНрддрддрд╛ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдореВрд░реНрдд рдХреЛ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЧрдгрд┐рддреАрдп рдкрд░рдВрдкрд░рд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реИрдореНрдмрдбрд╛ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ:

 #   square(x) = x^2 #   x -> x^2 #   hypot(a, b) = sqrt(x^2 + y^2) #   -    ,    , #              (x, y) -> sqrt(x^2 + y^2) #   fortytwo() = 42 #   () -> 42 julia> map(i -> map(x -> x^i, 1:5), 1:5) 5-element Array{Array{Int64,1},1}: [1, 2, 3, 4, 5] [1, 4, 9, 16, 25] [1, 8, 27, 64, 125] [1, 16, 81, 256, 625] [1, 32, 243, 1024, 3125] 

рдирд╛рдо рдФрд░ рдЕрдирд╛рдо рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 julia> double_squared = x -> (2 * x)^2 #17 (generic function with 1 method) julia> double_squared(5) 100 

рд╡реИрд░рд┐рдПрдмрд▓ рд╕реНрдХреЛрдк рдФрд░ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдХреНрд▓реЛрдЬрд░


рдЖрдо рддреМрд░ рдкрд░, рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдп рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбреЗрдЯрд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╢рд░реАрд░ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЪрд░ рдирд╛рдо рдпрд╛ рддреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рддрд░реНрдХ рдХреЗ рдирд╛рдо рд╣реИрдВ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдХрд╛рдп рдХреЗ рдЕрдВрджрд░ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рдирд╛рдо рд╣реИрдВред

 function normal(x, y) z = x + y x + y * z end function strange(x, y) x + y * z end 

normal() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╕рднреА рдЪрд░ рдирд╛рдо рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ , рдЕрд░реНрдерд╛рддреНред рдЕрдЧрд░ рд╣рдо рд╣рд░ рдЬрдЧрд╣ (рддрд░реНрдХ рд╕реВрдЪреА рд╕рд╣рд┐рдд) "x" рдХреЛ "m" (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛), "y" рдХреЛ "n" рдФрд░ "z" рдХреЛ "sum_of_m_and_n" рд╕реЗ рдмрджрд▓ рджреЗрдВ, рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЕрд░реНрде рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред strange() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдирд╛рдо z рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИ , рдЕрд░реНрдерд╛рддреНред a) рдпрджрд┐ рдпрд╣ рдирд╛рдо рджреВрд╕рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ b) рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрджреНрдзрддрд╛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди "z" рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдЙрд╕ рд╕рдордп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, normal() рдлрд╝рдВрдХреНрд╢рди рднреА рдЗрддрдирд╛ рд╕рд╛рдл рдирд╣реАрдВ рд╣реИ:

  1. рдпрджрд┐ z рдирд╛рдо рдХрд╛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
  2. + рдФрд░ * рдЕрдХреНрд╖рд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрд╕рдВрдмрдВрдзрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рднреА рд╣реИрдВред

рдмрд┐рдВрджреБ 2 рдХреЗ рд╕рд╛рде, рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдореМрдЬреВрдж рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдо рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд░реНрде рд╣рдорд╛рд░реА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдкреЙрдЗрдВрдЯ 1 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛рдБ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ normal() рдЕрдВрджрд░ z normal() рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд рдпрджрд┐ рдХреЛрдИ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ z рдЗрд╕рдХрд╛ рдорд╛рди рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╣реИ, рддреЛ рдпрджрд┐ рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ z рдХреА рдкрд╣рд▓реЗ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╛рд╣рд░реА рдЪрд░ рдХрд╛ рдорд╛рди рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ рдмрд╛рд╣рд░реА рдЪрд░ рдХрд╛ рдирд╛рдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд╛рдо рдЙрд╕ рдорд╛рди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдореМрдЬреВрдж рдерд╛ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рдЗрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдЪрд░ рдХреЛ "рдХреИрдкреНрдЪрд░" рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдирдП рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдХреНрд▓реЛрдЬрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрд▓реЛрдЬрд╝рд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рджреЛ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ: рдЬрдм рдЖрдкрдХреЛ рджрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред

рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдореЗрдЯрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 function f_with_counter(fn) call_count = 0 ncalls() = call_count # invoke()  ,     #    ,  ncalls() function invoke(args...) call_count += 1 fn(args...) end #         # call_count     , #   invoke()  call_count()        (call = invoke, call_count = ncalls) end julia> abscount = f_with_counter(abs) (call = getfield(Main, Symbol("#invoke#22")){typeof(abs)}(abs, Core.Box(0)), call_count = getfield(Main, Symbol("#ncalls#21"))(Core.Box(0))) julia> abscount.call_count() 0 julia> abscount.call(-20) 20 julia> abscount.call_count() 1 julia> abscount.call(im) 1.0 julia> abscount.call_count() 2 

рдХреЗрд╕ рд╕реНрдЯрдбреА: рд╕рднреА рдПрдХ рд╣реА рдмрд╣реБрдкрдж


рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдкрдж рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рднрдВрдбрд╛рд░рдг рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЧреБрдгрд╛рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬреЛ рд╕рдмрд╕реЗ рдХрдо рдЙрдореНрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдмрд┐рдВрджреБ x рдкрд░ рдмрд╣реБрдкрдж p рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП x рдлрдВрдХреНрд╢рди evpoly(p, x) , рдЬреЛ рд╣реЙрд░реНрдирд░ рд╕реНрдХреАрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╣реБрдкрдж рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред

рдкреВрд░реНрдг рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛрдб
 abstract type AbstractPolynomial end """ Polynomial <: AbstractPolynomial Polynomials written in the canonical form --- Polynomial(v::T) where T<:Union{Vector{<:Real}, NTuple{<:Any, <:Real}}) Construct a `Polynomial` from the list of the coefficients. The coefficients are assumed to go from power 0 in the ascending order. If an empty collection is provided, the constructor returns a zero polynomial. """ struct Polynomial<:AbstractPolynomial degree::Int coeff::NTuple{N, Float64} where N function Polynomial(v::T where T<:Union{Vector{<:Real}, NTuple{<:Any, <:Real}}) coeff = isempty(v) ? (0.0,) : tuple([Float64(x) for x in v]...) return new(length(coeff)-1, coeff) end end """ InterpPolynomial <: AbstractPolynomial Interpolation polynomials in Newton's form --- InterpPolynomial(xsample::Vector{<:Real}, fsample::Vector{<:Real}) Construct an `InterpPolynomial` from a vector of points `xsample` and corresponding function values `fsample`. All values in `xsample` must be distinct. """ struct InterpPolynomial<:AbstractPolynomial degree::Int xval::NTuple{N, Float64} where N coeff::NTuple{N, Float64} where N function InterpPolynomial(xsample::X, fsample::F) where {X<:Union{Vector{<:Real}, NTuple{<:Any, <:Real}}, F<:Union{Vector{<:Real}, NTuple{<:Any, <:Real}}} if !allunique(xsample) throw(DomainError("Cannot interpolate with duplicate X points")) end N = length(xsample) if length(fsample) != N throw(DomainError("Lengths of X and F are not the same")) end coeff = [Float64(f) for f in fsample] for i = 2:N for j = 1:(i-1) coeff[i] = (coeff[j] - coeff[i]) / (xsample[j] - xsample[i]) end end new(N-1, ntuple(i -> Float64(xsample[i]), N), tuple(coeff...)) end end function InterpPolynomial(fn, xsample::T) where {T<:Union{Vector{<:Real}, NTuple{<:Any, <:Real}}} InterpPolynomial(xsample, map(fn, xsample)) end function evpoly(p::Polynomial, z::Real) ans = p.coeff[end] for idx = p.degree:-1:1 ans = p.coeff[idx] + z * ans end return ans end function evpoly(p::InterpPolynomial, z::Real) ans = p.coeff[p.degree+1] for idx = p.degree:-1:1 ans = ans * (z - p.xval[idx]) + p.coeff[idx] end return ans end function Base.:+(p1::Polynomial, p2::Polynomial) #    ,      deg = max(p1.degree, p2.degree) coeff = zeros(deg+1) coeff[1:p1.degree+1] .+= p1.coeff coeff[1:p2.degree+1] .+= p2.coeff Polynomial(coeff) end function Base.:+(p1::InterpPolynomial, p2::InterpPolynomial) xmax = max(p1.xval..., p2.xval...) xmin = min(p1.xval..., p2.xval...) deg = max(p1.degree, p2.degree) #         #       xmid = 0.5 * xmax + 0.5 * xmin dx = 0.5 * (xmax - xmin) / cos(0.5 * ╧А / (deg + 1)) chebgrid = [xmid + dx * cos((k - 0.5) * ╧А / (deg + 1)) for k = 1:deg+1] fsample = [evpoly(p1, x) + evpoly(p2, x) for x in chebgrid] InterpPolynomial(chebgrid, fsample) end function Base.:+(p1::InterpPolynomial, p2::Polynomial) xmax = max(p1.xval...) xmin = min(p1.xval...) deg = max(p1.degree, p2.degree) xmid = 0.5 * xmax + 0.5 * xmin dx = 0.5 * (xmax - xmin) / cos(0.5 * ╧А / (deg + 1)) chebgrid = [xmid + dx * cos((k - 0.5) * ╧А / (deg + 1)) for k = 1:deg+1] fsample = [evpoly(p1, x) + evpoly(p2, x) for x in chebgrid] InterpPolynomial(chebgrid, fsample) end function Base.:+(p1::Polynomial, p2::InterpPolynomial) p2 + p1 end 


рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрд╣реБрдкрдж рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреА рд╕рд╣рдЬ рд╕рдордЭ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдХреЗ, рдмрд╣реБрдкрдж рдХреЛ рднреА рд╕реАрдзреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдпрд╣ рдерд╛:

 struct Polynomial degree::Int coeff::NTuple{N, Float64} where N function Polynomial(v::T where T<:Union{Vector{<:Real}, NTuple{<:Any, <:Real}}) #     /     P(x) тЙб 0 coeff = isempty(v) ? (0.0,) : tuple([Float64(x) for x in v]...) #   -   new #  -    return new(length(coeff)-1, coeff) end end """ evpoly(p::Polynomial, z::Real) Evaluate polynomial `p` at `z` using the Horner's rule """ function evpoly(p::Polynomial, z::Real) ans = p.coeff[end] for idx = p.degree:-1:1 ans = p.coeff[idx] + z * ans end return ans end 

рд╣рдо рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдЬреЛ рдЧреБрдгрд╛рдВрдХ рдХреЗ рдПрдХ рд╕рд░рдгреА / рдЯреНрдпреВрдкрд▓ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдкрджреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ:
 function Polynomial_as_closure(v::T where T<:Union{Vector{<:Real}, NTuple{<:Any, <:Real}}) #     /     P(x) тЙб 0 if isempty(v) return x::Real -> 0.0 end coeff = tuple(map(float, v)...) degree = length(coeff) - 1 function evpoly(z::Real) ans = coeff[end] for idx = degree:-1:1 ans = coeff[idx] + z * ans end return ans end evpoly end julia> p = Polynomial_as_closure((0, 1, 1)) # x┬▓ + x (::getfield(Main, Symbol("#evpoly#28")){Tuple{Float64,Float64,Float64},Int64}) (generic function with 1 method) julia> p(1) # ,    evpoly()! 2.0 julia> p(11) 132.0 

рдЗрд╕реА рддрд░рд╣, рдЖрдк рдкреНрд░рдХреНрд╖реЗрдк рдмрд╣реБрдкрдж рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╡рд╛рд▓: рдХреНрдпрд╛ рдРрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝ рдереА рдЬреЛ рдкрд┐рдЫрд▓реА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдирдИ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЦреЛ рдЧрдИ рдереА? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рд╛рдБ - рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдкрдж рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджрд┐рдпрд╛, рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдХрд╛рд╢, рдЬреВрд▓рд┐рдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рдХрд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдЖрдкрдХреЛ рддрдерд╛рдХрдерд┐рдд рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╛рдиреА рдЖрдк рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрд╣реБрдкрдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ! рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

 function (p::Polynomial)(z::Real) evpoly(p, z) end function (p::InterpPolynomial)(z::Real) evpoly(p, z) end 

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдПрдХ рд╕реЗрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХреНрд╖реЗрдк рдмрд╣реБрдкрдж рдХрд╛ рдмрд╛рд╣рд░реА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 function InterpPolynomial(fn, xsample::T) where {T<:Union{Vector{<:Real}, NTuple{<:Any, <:Real}}} InterpPolynomial(xsample, map(fn, xsample)) end 

рд╣рдо рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
 julia> psin = InterpPolynomial(sin, [0, ╧А/6, ╧А/2, 5*╧А/6, ╧А]) #   InterpPolynomial(4, (0.0, 0.5235987755982988, 1.5707963267948966, 2.6179938779914944, 3.141592653589793), (0.0, 0.954929658551372, -0.30396355092701327, -0.05805276197975913, 0.036957536116863636)) julia> pcos = InterpPolynomial(cos, [0, ╧А/6, ╧А/2, 5*╧А/6, ╧А]) #   InterpPolynomial(4, (0.0, 0.5235987755982988, 1.5707963267948966, 2.6179938779914944, 3.141592653589793), (1.0, -0.2558726308373678, -0.36358673785585766, 0.1388799037738005, 5.300924469105863e-17)) julia> psum = pcos + psin InterpPolynomial(4, (3.141592653589793, 2.5416018461576297, 1.5707963267948966, 0.5999908074321635, 0.0), (-1.0, -1.2354929267138448, 0.03888175053443867, 0.1969326657535598, 0.03695753611686364)) julia> for x = range(0, ╧А, length = 20) println("Error at x = ", x, ": ", abs(psum(x) - (sin(x) + cos(x)))) end Error at x = 0.0: 0.0 Error at x = 0.3490658503988659: 0.002748366490382681 Error at x = 0.6981317007977318: 0.0031870524474437723 Error at x = 1.0471975511965976: 0.006538414090220712 Error at x = 1.3962634015954636: 0.0033647273630357244 Error at x = 1.7453292519943295: 0.003570894863996865 Error at x = 2.0943951023931953: 0.007820939854677023 Error at x = 2.443460952792061: 0.004305934583281101 Error at x = 2.792526803190927: 0.00420977797025246 Error at x = 3.141592653589793: 1.1102230246251565e-16 


рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдЙрдзрд╛рд░ рд▓реА рдЧрдИ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рднрд╛рд╖рд╛ рджреЗрддреА рд╣реИрдВред рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрдгрд┐рддреАрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi451172/


All Articles