Julia 复数与有理数完全指南(中文版)
精确计算的利器 —— 避免浮点误差,拥抱数学之美
一、为什么需要复数和有理数?
| 类型 | 问题 | Julia 解决方案 |
|---|---|---|
Float64 | 0.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 | 分数坐标 |
| 信号处理 | Complex | FFT、滤波器 |
| 精确分数 | 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
八、速查表
| 类型 | 构造 | 实部/分子 | 虚部/分母 | 共轭/约分 | 模长 |
|---|---|---|---|---|---|
Complex | a + bim | real(z) | imag(z) | conj(z) | abs(z) |
Rational | a//b | numerator(r) | denominator(r) | 自动 | float(r) |
九、小练习(立即上手)
- 验证欧拉公式:
exp(im*π) + 1 ≈ 0 - 实现分数加法函数(返回
Rational) - 计算复数
z的极坐标形式 - 写一个
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 + 4i | 3 + 4im |
1/3 + 1/6 | 1//3 + 1//6 |
2//0 | 运行时错误 |
Int(1//3) | trunc(Int, 1//3) |
恭喜!你已精通 Julia 复数与有理数!
现在你可以:
- 写出无误差的分数计算
- 轻松处理复数信号
- 在教学中展示数学之美
下一站推荐
| 主题 | 为什么学 |
|---|---|
BigFloat / BigInt | 任意精度计算 |
Polynomials.jl | 多项式 + 复数根 |
FFT 与信号处理 | 复数核心应用 |
| 量子计算模拟 | 全靠复数 |
需要我:
- 写一个复数绘图工具(复平面)?
- 实现有理数四则运算结构体?
- 演示复数 FFT 变换?
随时告诉我!