Julia 复数和有理数

Julia 复数与有理数完全指南(中文版)

精确计算的利器 —— 避免浮点误差,拥抱数学之美


一、为什么需要复数和有理数?

类型问题Julia 解决方案
Float640.1 + 0.2 ≠ 0.3→ 用 Rational
实数计算需要虚部→ 用 Complex
信号处理、量子力学必须复数→ 原生支持

二、复数(Complex)

1. 创建复数

z1 = 3 + 4im          # 推荐写法
z2 = 3.0 + 4.0im
z3 = complex(3, 4)    # 函数式
z4 = 3im              # 纯虚数

im 是全局常量:√(-1)

typeof(z1)            # Complex{Int64}
typeof(z2)            # Complex{Float64}

2. 基本属性与函数

z = 3 + 4im

real(z)     # 3
imag(z)     # 4
conj(z)     # 3 - 4im (共轭)
abs(z)      # 5.0   (模长)
abs2(z)     # 25    (模长平方,更快)
angle(z)    # 0.9273... (弧度)

3. 复数运算

z1 = 1 + 2im
z2 = 3 - 4im

z1 + z2     # 4 - 2im
z1 - z2     # -2 + 6im
z1 * z2     # 11 + 2im
z1 / z2     # -0.2 + 0.4im
z1^3        # (-11 + 2im)

所有算术运算都自动支持复数


4. 数学函数(自动扩展)

sin(z)      # 支持复数辛格函数
cos(z)
exp(z)      # e^z
log(z)      # 主支对数
sqrt(z)     # 主支平方根
exp(1im * π) + 1 ≈ 0  # 欧拉公式

5. 复数数组

zs = [1+im, 2+2im, 3+3im]      # Vector{Complex{Int64}}
matrix = [1+im 2+im; 3+im 4+im] # 2×2 复数矩阵

支持所有线性代数操作(特征值、SVD 等)


三、有理数(Rational)

1. 创建有理数

r1 = 2//3          # 推荐!分子//分母
r2 = 1//2 + 1//6    # 2//3(自动通分)
r3 = 4//2          # 2//1(自动约分)

// 构造有理数,自动约分 + 符号归一

typeof(2//3)       # Rational{Int64}

2. 基本操作

a = 3//4
b = 2//5

a + b     # 23//20
a - b     # 7//20
a * b     # 6//20 → 3//10
a / b     # 15//8
a^2       # 9//16

3. 转换与提取

r = 5//8

numerator(r)    # 5
denominator(r)  # 8
float(r)        # 0.625
Int(r)          # 错误!需明确
trunc(Int, r)   # 0
round(Int, r)   # 1

4. 与浮点数混用(自动升级)

r = 1//3
f = 0.5

r + f     # 0.8333... → Float64
r * f     # 0.1666... → Float64

警告:混用后失去精确性!


四、高级技巧

1. 构造任意精度的有理数

BigInt(1)//BigInt(3)    # 高精度有理数

2. 复数 + 有理数

z = (1//2) + (3//4)im   # Complex{Rational{Int64}}

3. 性能对比

using BenchmarkTools

@btime 0.1 + 0.2;        # ~1 ns,误差!
@btime 1//10 + 1//5;     # ~5 ns,精确!

有理数稍慢,但绝对精确


五、应用场景

场景推荐类型示例
几何计算Rational分数坐标
信号处理ComplexFFT、滤波器
精确分数Rational概率、配比
教学演示两者欧拉公式、分数运算

六、综合示例:复数几何

# 定义复数点
A = 1 + 2im
B = 3 - 1im
C = -1 + 1im

# 计算三角形面积(Shoelace 公式)
function area(z1, z2, z3)
    (z1*conj(z2) + z2*conj(z3) + z3*conj(z1) - 
     conj(z1)*z2 - conj(z2)*z3 - conj(z3)*z1) / (4im)
end

area(A, B, C) |> abs

七、综合示例:分数计算器

struct Fraction
    num::Int
    den::Int
    Fraction(n, d) = d == 0 ? error("分母不能为0") : new(n, d)
end

# 自动转换为 Rational
Base.://(f::Fraction) = f.num // f.den
Base.show(io::IO, f::Fraction) = print(io, "$(f.num)//$(f.den)")

f = Fraction(3, 4)
r = f//          # 3//4

八、速查表

类型构造实部/分子虚部/分母共轭/约分模长
Complexa + bimreal(z)imag(z)conj(z)abs(z)
Rationala//bnumerator(r)denominator(r)自动float(r)

九、小练习(立即上手)

  1. 验证欧拉公式exp(im*π) + 1 ≈ 0
  2. 实现分数加法函数(返回 Rational
  3. 计算复数 z 的极坐标形式
  4. 写一个 Rational 数组求和函数(保持精确)

答案示例

# 1. 欧拉公式
exp(im*π) + 1 ≈ 0im  # true(浮点误差极小)

# 2. 分数加法
add_frac(a::Rational, b::Rational) = a + b
add_frac(1//3, 1//6)  # 1//2

# 3. 极坐标
polar(z) = (abs(z), angle(z))
polar(3+4im)  # (5.0, 0.9273...)

# 4. 精确求和
exact_sum(fracs::Vector{Rational{Int}}) = sum(fracs)
exact_sum([1//3, 1//6, 1//2])  # 1//1

十、常见错误与避坑

错误正确写法
3 + 4i3 + 4im
1/3 + 1/61//3 + 1//6
2//0运行时错误
Int(1//3)trunc(Int, 1//3)

恭喜!你已精通 Julia 复数与有理数!

现在你可以:

  • 写出无误差的分数计算
  • 轻松处理复数信号
  • 在教学中展示数学之美

下一站推荐

主题为什么学
BigFloat / BigInt任意精度计算
Polynomials.jl多项式 + 复数根
FFT 与信号处理复数核心应用
量子计算模拟全靠复数

需要我:

  • 写一个复数绘图工具(复平面)?
  • 实现有理数四则运算结构体
  • 演示复数 FFT 变换

随时告诉我!

文章已创建 2305

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部