модуль CMath
Тригонометрические и трансцендентные функции для комплексных чисел.
CMath - это библиотека, предоставляющая тригонометрические и трансцендентные функции для комплексных чисел. Функции в этом модуле принимают в качестве аргументов целые числа, числа с плавающей точкой или комплексные числа.
Обратите внимание, что набор функций похож, но не идентичен набору функций в модуле math. Причина наличия двух модулей заключается в том, что некоторые пользователи не заинтересованы в комплексных числах и, возможно, даже не знают, что это такое. Им бы скорее хотелось, чтобы Math.sqrt вызывал исключение, чем возвращал комплексное число.
Для получения дополнительной информации вы можете посмотреть класс Complex.
Использование
Чтобы начать использовать эту библиотеку, просто подключите библиотеку cmath:
require "cmath"
Открытые методы класса
# File lib/cmath.rb, line 280
def acos(z)
begin
if z.real? and z >= -1 and z <= 1
RealMath.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 345
def acosh(z)
begin
if z.real? and z >= 1
RealMath.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 264
def asin(z)
begin
if z.real? and z >= -1 and z <= 1
RealMath.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 329
def asinh(z)
begin
if z.real?
RealMath.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 296
def atan(z)
begin
if z.real?
RealMath.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 313
def atan2(y,x)
begin
if y.real? and x.real?
RealMath.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 361
def atanh(z)
begin
if z.real? and z >= -1 and z <= 1
RealMath.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 156 def cbrt(z) z ** (1.0/3) end
Возвращает главное значение кубического корня из z
CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
# File lib/cmath.rb, line 181
def cos(z)
begin
if z.real?
RealMath.cos(z)
else
Complex(RealMath.cos(z.real) * RealMath.cosh(z.imag),
-RealMath.sin(z.real) * RealMath.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 231
def cosh(z)
begin
if z.real?
RealMath.cosh(z)
else
Complex(RealMath.cosh(z.real) * RealMath.cos(z.imag),
RealMath.sinh(z.real) * RealMath.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?
RealMath.exp(z)
else
ere = RealMath.exp(z.real)
Complex(ere * RealMath.cos(z.imag),
ere * RealMath.sin(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end Math::E, возведенное в степень z
CMath.exp(1.i * Math::PI) #=> (-1.0+1.2246467991473532e-16i)
# File lib/cmath.rb, line 81
def log(z, b=::Math::E)
begin
if z.real? && z >= 0 && b >= 0
RealMath.log(z, b)
else
Complex(RealMath.log(z.abs), z.arg) / log(b)
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 113
def log10(z)
begin
if z.real? and z >= 0
RealMath.log10(z)
else
log(z) / RealMath.log(10)
end
rescue NoMethodError
handle_no_method_error
end
end Возвращает десятичный логарифм z
CMath.log10(-1) #=> (0.0+1.3643763538418412i)
# File lib/cmath.rb, line 97
def log2(z)
begin
if z.real? and z >= 0
RealMath.log2(z)
else
log(z) / RealMath.log(2)
end
rescue NoMethodError
handle_no_method_error
end
end Возвращает двоичный логарифм z
CMath.log2(-1) => (0.0+4.532360141827194i)
# File lib/cmath.rb, line 164
def sin(z)
begin
if z.real?
RealMath.sin(z)
else
Complex(RealMath.sin(z.real) * RealMath.cosh(z.imag),
RealMath.cos(z.real) * RealMath.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 214
def sinh(z)
begin
if z.real?
RealMath.sinh(z)
else
Complex(RealMath.sinh(z.real) * RealMath.cos(z.imag),
RealMath.cosh(z.real) * RealMath.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 129
def sqrt(z)
begin
if z.real?
if z < 0
Complex(0, RealMath.sqrt(-z))
else
RealMath.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(RealMath.sqrt((r + x) / 2.0), RealMath.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 198
def tan(z)
begin
if z.real?
RealMath.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 248
def tanh(z)
begin
if z.real?
RealMath.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 280
def acos(z)
begin
if z.real? and z >= -1 and z <= 1
RealMath.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 345
def acosh(z)
begin
if z.real? and z >= 1
RealMath.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 264
def asin(z)
begin
if z.real? and z >= -1 and z <= 1
RealMath.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 329
def asinh(z)
begin
if z.real?
RealMath.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 296
def atan(z)
begin
if z.real?
RealMath.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 313
def atan2(y,x)
begin
if y.real? and x.real?
RealMath.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 361
def atanh(z)
begin
if z.real? and z >= -1 and z <= 1
RealMath.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 156 def cbrt(z) z ** (1.0/3) end
Возвращает главное значение кубического корня из z
CMath.cbrt(1 + 4i) #=> (1.449461632813119+0.6858152562177092i)
# File lib/cmath.rb, line 181
def cos(z)
begin
if z.real?
RealMath.cos(z)
else
Complex(RealMath.cos(z.real) * RealMath.cosh(z.imag),
-RealMath.sin(z.real) * RealMath.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 231
def cosh(z)
begin
if z.real?
RealMath.cosh(z)
else
Complex(RealMath.cosh(z.real) * RealMath.cos(z.imag),
RealMath.sinh(z.real) * RealMath.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?
RealMath.exp(z)
else
ere = RealMath.exp(z.real)
Complex(ere * RealMath.cos(z.imag),
ere * RealMath.sin(z.imag))
end
rescue NoMethodError
handle_no_method_error
end
end Math::E в степени z
CMath.exp(1.i * Math::PI) #=> (-1.0+1.2246467991473532e-16i)
# File lib/cmath.rb, line 81
def log(z, b=::Math::E)
begin
if z.real? && z >= 0 && b >= 0
RealMath.log(z, b)
else
Complex(RealMath.log(z.abs), z.arg) / log(b)
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 113
def log10(z)
begin
if z.real? and z >= 0
RealMath.log10(z)
else
log(z) / RealMath.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 97
def log2(z)
begin
if z.real? and z >= 0
RealMath.log2(z)
else
log(z) / RealMath.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 164
def sin(z)
begin
if z.real?
RealMath.sin(z)
else
Complex(RealMath.sin(z.real) * RealMath.cosh(z.imag),
RealMath.cos(z.real) * RealMath.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 214
def sinh(z)
begin
if z.real?
RealMath.sinh(z)
else
Complex(RealMath.sinh(z.real) * RealMath.cos(z.imag),
RealMath.cosh(z.real) * RealMath.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 129
def sqrt(z)
begin
if z.real?
if z < 0
Complex(0, RealMath.sqrt(-z))
else
RealMath.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(RealMath.sqrt((r + x) / 2.0), RealMath.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 198
def tan(z)
begin
if z.real?
RealMath.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 248
def tanh(z)
begin
if z.real?
RealMath.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.