Python 和 Ruby 中的数学/Ruby 中的复数
由于实数可以严格排序,而复数不能,因此像Ruby这样的面向对象的语言并不真正将复数视为数字。然而,Ruby有一个对象来处理这些数字,它被称为Complex。
例如,要创建复数4+3i,只需写
a=Complex(4,3)
puts(a)
这需要两个数字,可以是分数或整数。在后一种情况下,复数是一个高斯整数。这个信息在晚餐时可能会有用,谁知道呢?
加法、减法、乘法和除法仍然分别用+、-、*和/表示
a=Complex(2,3)
b=Complex(4,3)
puts(a+b)
puts(a-b)
puts(a*b)
puts(a/b)
这些示例表明,两个高斯整数的和、差和积也是高斯整数,但它们的商不一定总是高斯整数。减法示例表明,即使运算结果是实数,Ruby仍然将其视为复数。
要将复数乘方,仍然使用双星号
i=Complex(0,1)
puts(i**2)
puts(i**i)
这里 而不是真正的 -1!此外, 是一个实数!顺便说一下,指数不一定是实数。
但以 0.5 作为指数,可以计算复数的平方根。但任何复数(零除外)都有两个平方根。Ruby如何在它们之间选择?例如,7+24i的平方根是4+3i和-4-3i。Ruby选择第一个。其他示例
puts((-1)**0.5)
puts(Complex(-1,0)**0.5)
如果 -1 被视为实数,它根本没有平方根,而如果将其视为复数,它有两个平方根,最接近i的那个将被显示(但它并不完全等于i,因为有舍入误差)
用于创建复数的两个(实数)是它的实部和虚部。它们可以用real和imag获得
a=Complex(4,3)
puts(a.real)
puts(a.imag)
puts(a.conj)
这个示例展示了另一个性质,即复数的共轭,与其他性质不同,它也是一个复数。
复数对几何学有用的主要性质是它的模数和幅角
a=Complex(4,3)
puts(a.abs)
puts(a.arg)
puts(a.polar)
最后一个性质,极坐标,同时给出模数和幅角,这使我们能够解决来自上一章的问题。
a=12
b=5
z=Complex(a,b)
puts(z.polar)
使用require 'cmath' ,可以访问复数上的函数。
require 'cmath'
t=Complex(0,Math::PI/3)
w=CMath.exp(t)
puts(w.real==0.5)
puts(w.real-0.5)
puts(w.imag==Math.sqrt(3)/2)
这个示例展示了写 表示 的合理性。
双曲函数也适用于复数
require 'cmath'
a=Complex(4,3)
puts(CMath.cosh(a))
puts(CMath.sinh(a))
puts(CMath.tanh(a))
前面函数的逆函数也可以应用于复数
require 'cmath'
a=Complex(4,3)
puts(CMath.log(a))
puts(CMath.log10(a))
puts(CMath.acosh(a))
puts(CMath.asinh(a))
puts(CMath.atanh(a))
每个复数都有一个余弦、正弦和正切
require 'cmath'
z=Complex(4,3)
puts(CMath.cos(z))
puts(CMath.sin(z))
puts(CMath.tan(z))
require 'cmath'
z=Complex(4,3)
puts(CMath.acos(z))
puts(CMath.asin(z))
puts(CMath.atan(z))
甚至可以将atan2应用于一对复数
require 'cmath'
a=Complex(4,3)
b=Complex(2,1)
puts(CMath.atan2(a,b))
这个复数版本的atan2 函数是复曲面的一个很好的例子:atan2(-1,-1) = 5π/4,而 atan2(1,1) = atan(1) = π/4
require 'cmath'
puts(CMath.atan2(-1,-1))
puts(CMath.atan2(1,1))