数学函数

TianYuan 提供了丰富的数学函数库,支持三角函数、双曲函数、指数对数函数、舍入函数等。所有数学函数都支持标量和矩阵操作,对矩阵进行逐元素计算。

三角函数

函数 说明 示例
sin(x) 正弦函数 sin(pi/2) → 1
cos(x) 余弦函数 cos(0) → 1
tan(x) 正切函数 tan(pi/4) → 1
cot(x) 余切函数 cot(pi/4) → 1
sec(x) 正割函数 (1/cos) sec(0) → 1
csc(x) 余割函数 (1/sin) csc(pi/2) → 1

三角函数示例

# 计算多个角度的正弦值
angles = [0, pi/6, pi/4, pi/3, pi/2]
values = sin(angles)
# 输出: [0, 0.5, 0.707, 0.866, 1.0]

# 绘制正弦和余弦曲线
x = linspace(0, 2*pi, 100)
y1 = sin(x)
y2 = cos(x)
plot(x, y1)
hold('on')
plot(x, y2)
legend(['sin(x)', 'cos(x)'])
title('三角函数图像')

反三角函数

函数 说明 返回范围 示例
asin(x) 反正弦函数 [-π/2, π/2] asin(1) → π/2
acos(x) 反余弦函数 [0, π] acos(0) → π/2
atan(x) 反正切函数 (-π/2, π/2) atan(1) → π/4
atan2(y, x) 四象限反正切(双参数) (-π, π] atan2(1, 1) → π/4
acot(x) 反余切函数 (0, π) acot(1) → π/4
asec(x) 反正割函数 [0, π], x≠π/2 asec(2) → π/3
acsc(x) 反余割函数 [-π/2, π/2], x≠0 acsc(2) → π/6

反三角函数示例

# 将角度转换为反三角函数值
x = [-1, -0.5, 0, 0.5, 1]
angles_rad = asin(x)
angles_deg = rad2deg(angles_rad)
disp('反正弦值(弧度):')
disp(angles_rad)
disp('反正弦值(角度):')
disp(angles_deg)

# 验证反三角函数的性质
x = 0.7
result = sin(asin(x))  # 应该等于 x
disp(['sin(asin(', num2str(x), ')) = ', num2str(result)])

双曲函数

函数 说明 定义 示例
sinh(x) 双曲正弦 (e^x - e^(-x))/2 sinh(0) → 0
cosh(x) 双曲余弦 (e^x + e^(-x))/2 cosh(0) → 1
tanh(x) 双曲正切 sinh(x)/cosh(x) tanh(0) → 0
coth(x) 双曲余切 cosh(x)/sinh(x) coth(1) → 1.313
sech(x) 双曲正割 1/cosh(x) sech(0) → 1
csch(x) 双曲余割 1/sinh(x) csch(1) → 0.851

双曲函数示例

# 绘制双曲函数图像
x = linspace(-3, 3, 100)
figure(1)
plot(x, sinh(x))
hold('on')
plot(x, cosh(x))
plot(x, tanh(x))
legend(['sinh(x)', 'cosh(x)', 'tanh(x)'])
title('双曲函数图像')
grid('on')

# 验证双曲函数恒等式
# cosh^2(x) - sinh^2(x) = 1
x = 2.5
result = cosh(x)^2 - sinh(x)^2
disp(['cosh^2(x) - sinh^2(x) = ', num2str(result)])

反双曲函数

函数 说明 定义域 示例
asinh(x) 反双曲正弦 全体实数 asinh(0) → 0
acosh(x) 反双曲余弦 x ≥ 1 acosh(1) → 0
atanh(x) 反双曲正切 -1 < x < 1 atanh(0) → 0
acoth(x) 反双曲余切 |x| > 1 acoth(2) → 0.549
asech(x) 反双曲正割 0 < x ≤ 1 asech(0.5) → 1.317
acsch(x) 反双曲余割 x ≠ 0 acsch(1) → 0.881

反双曲函数示例

# 验证反双曲函数
x = 1.5
y = sinh(x)
x_recovered = asinh(y)
disp(['原始值: ', num2str(x)])
disp(['恢复值: ', num2str(x_recovered)])

# 绘制反双曲函数
x1 = linspace(-5, 5, 100)
y1 = asinh(x1)
x2 = linspace(1, 5, 100)
y2 = acosh(x2)
x3 = linspace(-0.99, 0.99, 100)
y3 = atanh(x3)

figure(2)
plot(x1, y1)
hold('on')
plot(x2, y2)
plot(x3, y3)
legend(['asinh(x)', 'acosh(x)', 'atanh(x)'])
title('反双曲函数图像')
grid('on')

指数和对数函数

函数 说明 参数 返回值
exp(x) 指数函数 e^x x: 标量或矩阵 e 的 x 次方
log(x) 自然对数 ln(x) x: 正数标量或矩阵 以 e 为底的对数
log10(x) 常用对数 x: 正数标量或矩阵 以 10 为底的对数
log2(x) 二进制对数 x: 正数标量或矩阵 以 2 为底的对数
sqrt(x) 平方根 x: 非负标量或矩阵 x 的平方根

指数函数示例

# 指数增长模型
t = 0:0.1:5
k = 0.5
y = exp(k * t)
plot(t, y)
xlabel('时间')
ylabel('数量')
title('指数增长曲线')
grid('on')

# 计算 e 的近似值
e_approx = exp(1)
disp(['e ≈ ', num2str(e_approx)])

对数函数示例

# 对数变换
x = [1, 10, 100, 1000, 10000]
y_log = log10(x)
disp('原始值:')
disp(x)
disp('log10 值:')
disp(y_log)

# 对数坐标绘图
x = linspace(0.1, 100, 1000)
y = log(x)
plot(x, y)
xlabel('x')
ylabel('ln(x)')
title('自然对数函数')
grid('on')

# 对数运算性质验证
a = 5
b = 3
# log(a*b) = log(a) + log(b)
result1 = log(a * b)
result2 = log(a) + log(b)
disp(['log(', num2str(a*b), ') = ', num2str(result1)])
disp(['log(', num2str(a), ') + log(', num2str(b), ') = ', num2str(result2)])

平方根示例

# 计算平方根
numbers = [4, 9, 16, 25, 36]
roots = sqrt(numbers)
disp('平方根:')
disp(roots)

# 验证: sqrt(x)^2 = x
x = 7
result = sqrt(x)^2
disp(['sqrt(', num2str(x), ')^2 = ', num2str(result)])

# 矩阵的逐元素平方根
A = [1 4 9; 16 25 36]
B = sqrt(A)
disp('矩阵 A:')
disp(A)
disp('sqrt(A):')
disp(B)

绝对值函数

函数 说明 参数 返回值
abs(x) 绝对值或模 x: 标量或矩阵 非负数

绝对值示例

# 标量绝对值
x = -5.7
y = abs(x)
disp(['abs(', num2str(x), ') = ', num2str(y)])

# 矩阵绝对值
A = [-3, 2, -7; 4, -1, 6]
B = abs(A)
disp('原始矩阵:')
disp(A)
disp('绝对值矩阵:')
disp(B)

# 应用:计算向量的欧几里得范数
v = [-3, 4]
norm_v = sqrt(sum(abs(v).^2))
disp(['向量 ', mat2str(v), ' 的模长: ', num2str(norm_v)])

舍入函数

函数 说明 规则 示例
floor(x) 向下取整 不大于 x 的最大整数 floor(3.7) → 3
floor(-2.3) → -3
ceil(x) 向上取整 不小于 x 的最小整数 ceil(3.2) → 4
ceil(-2.7) → -2
round(x) 四舍五入 最接近的整数 round(3.5) → 4
round(3.4) → 3

舍入函数示例

# 比较不同的舍入方法
x = [-2.7, -2.3, 2.3, 2.7]
disp('原始值:')
disp(x)
disp('floor (向下取整):')
disp(floor(x))
disp('ceil (向上取整):')
disp(ceil(x))
disp('round (四舍五入):')
disp(round(x))

# 应用:将连续值离散化
temperature = [18.3, 22.7, 19.1, 25.9]
temp_rounded = round(temperature)
disp('原始温度:')
disp(temperature)
disp('四舍五入后:')
disp(temp_rounded)

# 生成整数坐标
x = rand(1, 5) * 10
y = rand(1, 5) * 10
x_int = floor(x)
y_int = floor(y)
disp('浮点坐标:')
disp([x; y]')
disp('整数坐标:')
disp([x_int; y_int]')

角度转换函数

函数 说明 转换 示例
deg2rad(x) 角度转弧度 弧度 = 角度 × π/180 deg2rad(180) → π
deg2rad(90) → π/2
rad2deg(x) 弧度转角度 角度 = 弧度 × 180/π rad2deg(pi) → 180
rad2deg(pi/2) → 90

角度转换示例

# 常用角度转换
angles_deg = [0, 30, 45, 60, 90, 180, 270, 360]
angles_rad = deg2rad(angles_deg)
disp('角度值:')
disp(angles_deg)
disp('对应弧度值:')
disp(angles_rad)

# 弧度转角度
rad_values = [0, pi/6, pi/4, pi/3, pi/2, pi]
deg_values = rad2deg(rad_values)
disp('弧度值:')
disp(rad_values)
disp('对应角度值:')
disp(deg_values)

# 三角函数计算(使用角度输入)
angle_deg = 30
angle_rad = deg2rad(angle_deg)
sine_value = sin(angle_rad)
disp(['sin(', num2str(angle_deg), '°) = ', num2str(sine_value)])

# 计算圆周上的点
n = 8  # 8个点
angles = linspace(0, 360, n+1)
angles = angles(1:n)  # 去掉最后一个重复点
angles_rad = deg2rad(angles)
x = cos(angles_rad)
y = sin(angles_rad)
plot(x, y, 'o')
title('单位圆上均匀分布的8个点')
grid('on')

复数函数

TianYuan 支持复数类型,以下函数用于操作复数:

函数说明示例
complex(re, im)创建复数complex(3, 4)3+4i
real(z)取实部real(3+4i)3
imag(z)取虚部imag(3+4i)4
abs(z)模(对复数为 |z|)abs(3+4i)5
conj(z)共轭conj(3+4i)3-4i
angle(z)辐角(弧度)angle(1+1i)pi/4

示例

% 创建复数
z1 = 3 + 4i        # 字面量
z2 = complex(1, -2) # complex(re, im)

# 基本运算
z3 = z1 + z2        # 4+2i
z4 = z1 * z2        # (3+4i)(1-2i) = 11-2i

# 复数属性
r1 = real(z1)       # 3
i1 = imag(z1)       # 4
m1 = abs(z1)        # 5.0(模)
a1 = angle(z1)      # atan2(4, 3)(辐角)
c1 = conj(z1)       # 3-4i(共轭)

# 极坐标形式:z = r * exp(i * theta)
r = 5
theta = pi / 4
z = r * (cos(theta) + sin(theta) * 1i)  # 等价复数

# 转置:' 对复数取共轭转置,.' 取普通转置
v = [1+1i, 2+2i]
v_herm = v'         # [1-1i; 2-2i](共轭转置)

综合应用示例

示例1:傅里叶级数近似

# 使用傅里叶级数近似方波
x = linspace(-pi, pi, 1000)
y = zeros(size(x))

# 计算前10项
n_terms = 10
for n = 1:n_terms
    y = y + (4/pi) * sin((2*n-1)*x) / (2*n-1)
end

plot(x, y)
xlabel('x')
ylabel('f(x)')
title(['方波的傅里叶级数近似 (', num2str(n_terms), ' 项)'])
grid('on')

示例2:数值微分

# 使用中心差分法计算导数
function df = numerical_derivative(f, x, h)
    df = (f(x + h) - f(x - h)) / (2 * h)
end

# 计算 sin(x) 在 x=pi/4 处的导数
x0 = pi/4
h = 0.0001
f = @(x) sin(x)
df_numerical = numerical_derivative(f, x0, h)
df_analytical = cos(x0)

disp(['数值导数: ', num2str(df_numerical)])
disp(['解析导数: ', num2str(df_analytical)])
disp(['误差: ', num2str(abs(df_numerical - df_analytical))])

示例3:极坐标绘图

# 绘制玫瑰线 r = sin(k*θ)
theta = linspace(0, 2*pi, 1000)
k = 4
r = abs(sin(k * theta))

# 转换为笛卡尔坐标
x = r .* cos(theta)
y = r .* sin(theta)

plot(x, y)
title(['玫瑰线: r = |sin(', num2str(k), 'θ)|'])
xlabel('x')
ylabel('y')
grid('on')

示例4:泰勒级数展开

# e^x 的泰勒级数展开
# e^x = 1 + x + x^2/2! + x^3/3! + ...

function y = exp_taylor(x, n_terms)
    y = zeros(size(x))
    for n = 0:(n_terms-1)
        y = y + x.^n / factorial(n)
    end
end

x = linspace(-2, 2, 100)
y_exact = exp(x)
y_approx5 = exp_taylor(x, 5)
y_approx10 = exp_taylor(x, 10)

plot(x, y_exact, 'k-')
hold('on')
plot(x, y_approx5, 'r--')
plot(x, y_approx10, 'b--')
legend(['精确值', '5项近似', '10项近似'])
title('e^x 的泰勒级数展开')
grid('on')

注意事项

定义域限制

  • 对数函数要求输入为正数
  • 反三角函数有特定的定义域(如 asin/acos 要求 |x| ≤ 1)
  • sqrt 要求输入非负
  • 某些反双曲函数有定义域限制(如 acosh 要求 x ≥ 1)

矩阵运算

  • 所有数学函数都支持逐元素操作
  • 输入矩阵时,函数会对每个元素独立计算
  • 输出矩阵的尺寸与输入相同

数值精度

  • TianYuan 使用双精度浮点数(64位)
  • 三角函数在特定点(如 sin(π))可能有微小误差
  • 避免对接近零的数取对数
  • 大数运算时注意溢出

角度单位

  • 所有三角函数使用弧度制
  • 使用 deg2rad 和 rad2deg 进行角度转换
  • π 可通过 pi 常量或 acos(-1) 获得