модуль CMath
Тригонометрические и трансцендентные функции для комплексных чисел.
CMath — библиотека, предоставляющая тригонометрические и трансцендентные функции для комплексных чисел. Функции в этом модуле принимают целые числа, числа с плавающей точкой или комплексные числа в качестве аргументов.
Обратите внимание, что выбор функций аналогичен, но не идентичен, выбору функций в модуле math. Причина наличия двух модулей заключается в том, что некоторые пользователи не заинтересованы в комплексных числах и, возможно, даже не знают, что они собой представляют. Они бы предпочли, чтобы Math#sqrt выбрасывала исключение, а не возвращала комплексное число.
Использование
Чтобы начать использовать эту библиотеку, просто подключите библиотеку cmath:
require "cmath"
И после вызовите любую функцию CMath. Например:
CMath.sqrt(-9) #=> 0+3.0i CMath.exp(0 + 0i) #=> 1.0+0.0i CMath.log10(-5.to_c) #=> (0.6989700043360187+1.3643763538418412i)
Для получения более подробной информации можно обратиться к классу Complec.
Методы публичного класса
# File lib/cmath.rb, line 288
def acos(z)
begin
if z.real? and z >= -1 and z <= 1
acos!(z)
else
(-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает арккосинус z
CMath.acos(1 + 1i) #=> (0.9045568943023813-1.0612750619050357i)
# File lib/cmath.rb, line 353
def acosh(z)
begin
if z.real? and z >= 1
acosh!(z)
else
log(z + sqrt(z * z - 1.0))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает обратную гиперболическую косинус z
CMath.acosh(1 + 1i) #=> (1.0612750619050357+0.9045568943023813i)
# File lib/cmath.rb, line 272
def asin(z)
begin
if z.real? and z >= -1 and z <= 1
asin!(z)
else
(-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает арксинус z
CMath.asin(1 + 1i) #=> (0.6662394324925153+1.0612750619050355i)
# File lib/cmath.rb, line 337
def asinh(z)
begin
if z.real?
asinh!(z)
else
log(z + sqrt(1.0 + z * z))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает обратный гиперболический синус z
CMath.asinh(1 + 1i) #=> (1.0612750619050357+0.6662394324925153i)
# File lib/cmath.rb, line 304
def atan(z)
begin
if z.real?
atan!(z)
else
1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
end
rescue NoMethodError
handle_no_method_error
end
end возвращает арктангенс z
CMath.atan(1 + 1i) #=> (1.0172219678978514+0.4023594781085251i)
# File lib/cmath.rb, line 321
def atan2(y,x)
begin
if y.real? and x.real?
atan2!(y,x)
else
(-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает арктангенс y, деленный на x, используя знаки y и x, чтобы определить квадрант
CMath.atan2(1 + 1i, 0) #=> (1.5707963267948966+0.0i)
# File lib/cmath.rb, line 369
def atanh(z)
begin
if z.real? and z >= -1 and z <= 1
atanh!(z)
else
log((1.0 + z) / (1.0 - z)) / 2.0
end
rescue NoMethodError
handle_no_method_error
end
end возвращает обратный гиперболический тангенс z
CMath.atanh(1 + 1i) #=> (0.4023594781085251+1.0172219678978514i)
# File lib/cmath.rb, line 164 def cbrt(z) z ** (1.0/3) end
возвращает главное значение кубического корня из z
CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
# File lib/cmath.rb, line 189
def cos(z)
begin
if z.real?
cos!(z)
else
Complex(cos!(z.real) * cosh!(z.imag),
-sin!(z.real) * sinh!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает косинус z, где z задано в радианах
CMath.cos(1 + 1i) #=> (0.8337300251311491-0.9888977057628651i)
# File lib/cmath.rb, line 239
def cosh(z)
begin
if z.real?
cosh!(z)
else
Complex(cosh!(z.real) * cos!(z.imag),
sinh!(z.real) * sin!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает гиперболический косинус z, где z задано в радианах
CMath.cosh(1 + 1i) #=> (0.8337300251311491+0.9888977057628651i)
# File lib/cmath.rb, line 61
def exp(z)
begin
if z.real?
exp!(z)
else
ere = exp!(z.real)
Complex(ere * cos!(z.imag),
ere * sin!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end Math::E в степени z
CMath.exp(2i) #=> (-0.4161468365471424+0.9092974268256817i)
# File lib/cmath.rb, line 81
def log(*args)
begin
z, b = args
unless b.nil? || b.kind_of?(Numeric)
raise TypeError, "Numeric Number required"
end
if z.real? and z >= 0 and (b.nil? or b >= 0)
log!(*args)
else
a = Complex(log!(z.abs), z.arg)
if b
a /= log(b)
end
a
end
rescue NoMethodError
handle_no_method_error
end
end Возвращает натуральный логарифм Complex. Если задан второй аргумент, он будет основанием логарифма.
CMath.log(1 + 4i) #=> (1.416606672028108+1.3258176636680326i) CMath.log(1 + 4i, 10) #=> (0.6152244606891369+0.5757952953408879i)
# File lib/cmath.rb, line 121
def log10(z)
begin
if z.real? and z >= 0
log10!(z)
else
log(z) / log!(10)
end
rescue NoMethodError
handle_no_method_error
end
end возвращает логарифм по основанию 10 от z
CMath.log10(-1) #=> (0.0+1.3643763538418412i)
# File lib/cmath.rb, line 105
def log2(z)
begin
if z.real? and z >= 0
log2!(z)
else
log(z) / log!(2)
end
rescue NoMethodError
handle_no_method_error
end
end возвращает логарифм по основанию 2 от z
CMath.log2(-1) => (0.0+4.532360141827194i)
# File lib/cmath.rb, line 172
def sin(z)
begin
if z.real?
sin!(z)
else
Complex(sin!(z.real) * cosh!(z.imag),
cos!(z.real) * sinh!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает синус z, где z задано в радианах
CMath.sin(1 + 1i) #=> (1.2984575814159773+0.6349639147847361i)
# File lib/cmath.rb, line 222
def sinh(z)
begin
if z.real?
sinh!(z)
else
Complex(sinh!(z.real) * cos!(z.imag),
cosh!(z.real) * sin!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает гиперболический синус от z, где z задано в радианах
CMath.sinh(1 + 1i) #=> (0.6349639147847361+1.2984575814159773i)
# File lib/cmath.rb, line 137
def sqrt(z)
begin
if z.real?
if z < 0
Complex(0, sqrt!(-z))
else
sqrt!(z)
end
else
if z.imag < 0 ||
(z.imag == 0 && z.imag.to_s[0] == '-')
sqrt(z.conjugate).conjugate
else
r = z.abs
x = z.real
Complex(sqrt!((r + x) / 2.0), sqrt!((r - x) / 2.0))
end
end
rescue NoMethodError
handle_no_method_error
end
end Возвращает неотрицательный квадратный корень из Complex.
CMath.sqrt(-1 + 0i) #=> 0.0+1.0i
# File lib/cmath.rb, line 206
def tan(z)
begin
if z.real?
tan!(z)
else
sin(z) / cos(z)
end
rescue NoMethodError
handle_no_method_error
end
end возвращает тангенс от z, где z задано в радианах
CMath.tan(1 + 1i) #=> (0.27175258531951174+1.0839233273386943i)
# File lib/cmath.rb, line 256
def tanh(z)
begin
if z.real?
tanh!(z)
else
sinh(z) / cosh(z)
end
rescue NoMethodError
handle_no_method_error
end
end возвращает гиперболический тангенс от z, где z задано в радианах
CMath.tanh(1 + 1i) #=> (1.0839233273386943+0.27175258531951174i)
Приватные методы экземпляра
# File lib/cmath.rb, line 288
def acos(z)
begin
if z.real? and z >= -1 and z <= 1
acos!(z)
else
(-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает арккосинус z
CMath.acos(1 + 1i) #=> (0.9045568943023813-1.0612750619050357i)
# File lib/cmath.rb, line 353
def acosh(z)
begin
if z.real? and z >= 1
acosh!(z)
else
log(z + sqrt(z * z - 1.0))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает обратный гиперболический косинус z
CMath.acosh(1 + 1i) #=> (1.0612750619050357+0.9045568943023813i)
# File lib/cmath.rb, line 272
def asin(z)
begin
if z.real? and z >= -1 and z <= 1
asin!(z)
else
(-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает арксинус z
CMath.asin(1 + 1i) #=> (0.6662394324925153+1.0612750619050355i)
# File lib/cmath.rb, line 337
def asinh(z)
begin
if z.real?
asinh!(z)
else
log(z + sqrt(1.0 + z * z))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает обратный гиперболический синус z
CMath.asinh(1 + 1i) #=> (1.0612750619050357+0.6662394324925153i)
# File lib/cmath.rb, line 304
def atan(z)
begin
if z.real?
atan!(z)
else
1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
end
rescue NoMethodError
handle_no_method_error
end
end возвращает арктангенс z
CMath.atan(1 + 1i) #=> (1.0172219678978514+0.4023594781085251i)
# File lib/cmath.rb, line 321
def atan2(y,x)
begin
if y.real? and x.real?
atan2!(y,x)
else
(-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает арктангенс y деленного на x, используя знаки y и x для определения квадранта
CMath.atan2(1 + 1i, 0) #=> (1.5707963267948966+0.0i)
# File lib/cmath.rb, line 369
def atanh(z)
begin
if z.real? and z >= -1 and z <= 1
atanh!(z)
else
log((1.0 + z) / (1.0 - z)) / 2.0
end
rescue NoMethodError
handle_no_method_error
end
end возвращает обратный гиперболический тангенс z
CMath.atanh(1 + 1i) #=> (0.4023594781085251+1.0172219678978514i)
# File lib/cmath.rb, line 164 def cbrt(z) z ** (1.0/3) end
возвращает главное значение кубического корня из z
CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
# File lib/cmath.rb, line 189
def cos(z)
begin
if z.real?
cos!(z)
else
Complex(cos!(z.real) * cosh!(z.imag),
-sin!(z.real) * sinh!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает косинус z, где z задан в радианах
CMath.cos(1 + 1i) #=> (0.8337300251311491-0.9888977057628651i)
# File lib/cmath.rb, line 239
def cosh(z)
begin
if z.real?
cosh!(z)
else
Complex(cosh!(z.real) * cos!(z.imag),
sinh!(z.real) * sin!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает гиперболический косинус z, где z задан в радианах
CMath.cosh(1 + 1i) #=> (0.8337300251311491+0.9888977057628651i)
# File lib/cmath.rb, line 61
def exp(z)
begin
if z.real?
exp!(z)
else
ere = exp!(z.real)
Complex(ere * cos!(z.imag),
ere * sin!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end Math::E, возведенное в степень z
CMath.exp(2i) #=> (-0.4161468365471424+0.9092974268256817i)
# File lib/cmath.rb, line 81
def log(*args)
begin
z, b = args
unless b.nil? || b.kind_of?(Numeric)
raise TypeError, "Numeric Number required"
end
if z.real? and z >= 0 and (b.nil? or b >= 0)
log!(*args)
else
a = Complex(log!(z.abs), z.arg)
if b
a /= log(b)
end
a
end
rescue NoMethodError
handle_no_method_error
end
end Возвращает натуральный логарифм Complex. Если задан второй аргумент, он будет основанием логарифма.
CMath.log(1 + 4i) #=> (1.416606672028108+1.3258176636680326i) CMath.log(1 + 4i, 10) #=> (0.6152244606891369+0.5757952953408879i)
# File lib/cmath.rb, line 121
def log10(z)
begin
if z.real? and z >= 0
log10!(z)
else
log(z) / log!(10)
end
rescue NoMethodError
handle_no_method_error
end
end возвращает десятичный логарифм z
CMath.log10(-1) #=> (0.0+1.3643763538418412i)
# File lib/cmath.rb, line 105
def log2(z)
begin
if z.real? and z >= 0
log2!(z)
else
log(z) / log!(2)
end
rescue NoMethodError
handle_no_method_error
end
end возвращает двоичный логарифм z
CMath.log2(-1) => (0.0+4.532360141827194i)
# File lib/cmath.rb, line 172
def sin(z)
begin
if z.real?
sin!(z)
else
Complex(sin!(z.real) * cosh!(z.imag),
cos!(z.real) * sinh!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает синус z, где z задан в радианах
CMath.sin(1 + 1i) #=> (1.2984575814159773+0.6349639147847361i)
# File lib/cmath.rb, line 222
def sinh(z)
begin
if z.real?
sinh!(z)
else
Complex(sinh!(z.real) * cos!(z.imag),
cosh!(z.real) * sin!(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end возвращает гиперболический синус от z, где z задано в радианах
CMath.sinh(1 + 1i) #=> (0.6349639147847361+1.2984575814159773i)
# File lib/cmath.rb, line 137
def sqrt(z)
begin
if z.real?
if z < 0
Complex(0, sqrt!(-z))
else
sqrt!(z)
end
else
if z.imag < 0 ||
(z.imag == 0 && z.imag.to_s[0] == '-')
sqrt(z.conjugate).conjugate
else
r = z.abs
x = z.real
Complex(sqrt!((r + x) / 2.0), sqrt!((r - x) / 2.0))
end
end
rescue NoMethodError
handle_no_method_error
end
end Возвращает неотрицательный квадратный корень из Complex.
CMath.sqrt(-1 + 0i) #=> 0.0+1.0i
# File lib/cmath.rb, line 206
def tan(z)
begin
if z.real?
tan!(z)
else
sin(z) / cos(z)
end
rescue NoMethodError
handle_no_method_error
end
end возвращает тангенс от z, где z задано в радианах
CMath.tan(1 + 1i) #=> (0.27175258531951174+1.0839233273386943i)
# File lib/cmath.rb, line 256
def tanh(z)
begin
if z.real?
tanh!(z)
else
sinh(z) / cosh(z)
end
rescue NoMethodError
handle_no_method_error
end
end возвращает гиперболический тангенс от z, где z задано в радианах
CMath.tanh(1 + 1i) #=> (1.0839233273386943+0.27175258531951174i)
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.