完整示例程序

本章提供一系列完整的 TianYuan 示例程序,涵盖从基础到进阶的各种应用场景。每个示例都是可以直接运行的完整程序,展示了语言的实际应用。

示例 1:矩阵计算器

这个程序展示了基本的矩阵创建和运算。

# ===============================================
# 矩阵计算器 - 基础矩阵运算演示
# ===============================================

disp("========== 矩阵计算器 ==========")

# 创建矩阵
A = [1 2 3; 4 5 6; 7 8 9]
B = [9 8 7; 6 5 4; 3 2 1]

disp("矩阵 A:")
disp(A)

disp("矩阵 B:")
disp(B)

# 矩阵加法
C = A + B
disp("A + B =")
disp(C)

# 矩阵乘法
D = A .* B  # 元素级乘法
disp("A .* B (元素级乘法) =")
disp(D)

# 转置
E = A'
disp("A 的转置:")
disp(E)

# 提取子矩阵
sub = A(1:2, 2:3)
disp("A 的子矩阵 A(1:2, 2:3):")
disp(sub)

# 矩阵统计
disp("A 的行和:")
disp(sum(A, 2))

disp("A 的列和:")
disp(sum(A))

disp("A 的最大值:")
disp(max(max(A)))

disp("计算完成!")
要点:演示了矩阵创建、基本运算、转置、索引和统计函数的使用。

示例 2:线性方程组求解

使用左除运算符求解线性方程组 Ax = b。

# ===============================================
# 线性方程组求解器
# ===============================================
# 求解方程组:
#   2x + y - z = 8
#   -3x - y + 2z = -11
#   -2x + y + 2z = -3

disp("========== 线性方程组求解 ==========")

# 系数矩阵
A = [2 1 -1; -3 -1 2; -2 1 2]
# 右端向量
b = [8; -11; -3]

disp("系数矩阵 A:")
disp(A)

disp("右端向量 b:")
disp(b)

# 检查矩阵是否可逆
d = det(A)
disp("矩阵的行列式: " + num2str(d))

if abs(d) > 1e-10
    # 使用左除求解
    x = A \ b
    
    disp("解向量 x:")
    disp(x)
    
    # 验证解
    verification = A * x
    disp("验证 Ax =")
    disp(verification)
    
    disp("误差:")
    error = norm(verification - b)
    disp(error)
else
    disp("矩阵奇异,无唯一解!")
end
要点:使用左除运算符 \ 求解线性方程组,并验证解的正确性。

示例 3:三角函数可视化

绘制多个三角函数在同一图形中。

# ===============================================
# 三角函数可视化
# ===============================================

disp("========== 三角函数绘图 ==========")

# 生成 x 轴数据
x = linspace(0, 2*pi, 100)

# 计算三角函数值
y_sin = sin(x)
y_cos = cos(x)
y_tan = tan(x)

# 创建图形
figure(1)

# 绘制正弦函数
plot(x, y_sin, "r-")
hold("on")

# 绘制余弦函数
plot(x, y_cos, "b--")

# 绘制正切函数(限制范围)
# 避免垂直渐近线
y_tan_limited = y_tan
for i = 1:length(y_tan)
    if abs(y_tan(i)) > 5
        y_tan_limited(i) = NaN
    end
end
plot(x, y_tan_limited, "g:")

hold("off")

# 添加图形标注
xlabel("x (弧度)")
ylabel("y")
title("三角函数图像")
legend("sin(x)", "cos(x)", "tan(x)")
grid("on")

disp("图形绘制完成!")
disp("红色实线: sin(x)")
disp("蓝色虚线: cos(x)")
disp("绿色点线: tan(x)")
要点:使用 hold("on") 在同一图形中绘制多条曲线,并添加图例和网格。

示例 4:梯形法数值积分

使用梯形法计算定积分。

# ===============================================
# 梯形法数值积分
# ===============================================
# 计算 ∫[0,π] sin(x) dx
# 理论值: 2

disp("========== 数值积分(梯形法) ==========")

# 定义积分函数
function y = f(x)
    y = sin(x)
end

# 积分区间和步长
a = 0
b = pi
n = 100  # 子区间数量

# 梯形法实现
h = (b - a) / n
x = linspace(a, b, n + 1)

# 计算函数值
y = zeros(1, n + 1)
for i = 1:(n + 1)
    y(i) = f(x(i))
end

# 应用梯形公式
integral = h * (y(1)/2 + sum(y(2:n)) + y(n+1)/2)

disp("积分区间: [" + num2str(a) + ", " + num2str(b) + "]")
disp("子区间数量: " + num2str(n))
disp("数值积分结果: " + num2str(integral))
disp("理论值: 2")
disp("误差: " + num2str(abs(integral - 2)))

# 绘制被积函数
figure(1)
x_plot = linspace(a, b, 200)
y_plot = sin(x_plot)
plot(x_plot, y_plot, "b-")
grid("on")
xlabel("x")
ylabel("sin(x)")
title("被积函数: sin(x)")
要点:实现经典的梯形法数值积分算法,展示循环和向量操作的结合。

示例 5:矩阵特征值分析

计算矩阵的特征值和特征向量,并验证特征方程。

# ===============================================
# 矩阵特征值分析
# ===============================================

disp("========== 特征值分析 ==========")

# 定义对称矩阵
A = [4 1 0; 1 3 1; 0 1 2]

disp("矩阵 A:")
disp(A)

# 计算特征值和特征向量
[V, D] = eig(A)

disp("特征值矩阵 D:")
disp(D)

disp("特征向量矩阵 V:")
disp(V)

# 提取特征值
lambda1 = D(1, 1)
lambda2 = D(2, 2)
lambda3 = D(3, 3)

disp("特征值:")
disp("λ1 = " + num2str(lambda1))
disp("λ2 = " + num2str(lambda2))
disp("λ3 = " + num2str(lambda3))

# 验证第一个特征向量
v1 = V(:, 1)
Av1 = A * v1
lambda_v1 = lambda1 * v1

disp("验证: A * v1 =")
disp(Av1)

disp("λ1 * v1 =")
disp(lambda_v1)

disp("误差:")
disp(norm(Av1 - lambda_v1))

# 计算矩阵的迹和行列式
tr = trace(A)
dt = det(A)

disp("矩阵的迹: " + num2str(tr))
disp("特征值之和: " + num2str(lambda1 + lambda2 + lambda3))

disp("矩阵的行列式: " + num2str(dt))
disp("特征值之积: " + num2str(lambda1 * lambda2 * lambda3))
要点:使用 eig() 函数计算特征值和特征向量,并验证特征方程 Av = λv。

示例 6:多项式拟合与可视化

使用最小二乘法拟合数据点,并绘制原始数据和拟合曲线。

# ===============================================
# 最小二乘多项式拟合
# ===============================================

disp("========== 最小二乘拟合 ==========")

# 生成带噪声的数据
x_data = linspace(0, 4, 20)'
y_true = 2 * x_data .^ 2 - 3 * x_data + 1
noise = randn(size(x_data)) * 2
y_data = y_true + noise

# 构建范德蒙德矩阵(二次多项式)
n = length(x_data)
A = [x_data .^ 2, x_data, ones(n, 1)]

# 最小二乘解
coeffs = A \ y_data

a = coeffs(1)
b = coeffs(2)
c = coeffs(3)

disp("拟合多项式: y = ax² + bx + c")
disp("系数 a = " + num2str(a))
disp("系数 b = " + num2str(b))
disp("系数 c = " + num2str(c))

# 计算拟合值
y_fit = A * coeffs

# 计算拟合优度 (R²)
SS_res = sum((y_data - y_fit) .^ 2)
SS_tot = sum((y_data - mean(y_data)) .^ 2)
R_squared = 1 - SS_res / SS_tot

disp("拟合优度 R² = " + num2str(R_squared))

# 绘制结果
figure(1)

# 原始数据点
scatter(x_data, y_data, "bo")
hold("on")

# 拟合曲线
x_smooth = linspace(0, 4, 100)'
y_smooth = a * x_smooth .^ 2 + b * x_smooth + c
plot(x_smooth, y_smooth, "r-")

hold("off")
xlabel("x")
ylabel("y")
title("最小二乘多项式拟合")
legend("数据点", "拟合曲线")
grid("on")

disp("绘图完成!")
要点:构建范德蒙德矩阵,使用最小二乘法拟合多项式,并计算拟合优度 R²。

示例 7:牛顿迭代法求方程根

使用牛顿迭代法求解非线性方程。

# ===============================================
# 牛顿迭代法求根
# ===============================================
# 求解方程: x³ - 2x - 5 = 0

disp("========== 牛顿迭代法 ==========")

# 定义函数和导数
function y = f(x)
    y = x ^ 3 - 2 * x - 5
end

function y = df(x)
    y = 3 * x ^ 2 - 2
end

# 牛顿迭代
x0 = 2.0           # 初始猜测
tolerance = 1e-10  # 容忍误差
max_iter = 50      # 最大迭代次数

disp("求解方程: x³ - 2x - 5 = 0")
disp("初始值: x0 = " + num2str(x0))
disp("")

x = x0
for i = 1:max_iter
    fx = f(x)
    dfx = df(x)
    
    # 牛顿迭代公式
    x_new = x - fx / dfx
    
    disp("迭代 " + num2str(i) + ": x = " + num2str(x_new) + ", f(x) = " + num2str(f(x_new)))
    
    # 检查收敛
    if abs(x_new - x) < tolerance
        disp("")
        disp("收敛!")
        x = x_new
        break
    end
    
    x = x_new
end

disp("")
disp("最终结果: x = " + num2str(x))
disp("验证: f(x) = " + num2str(f(x)))

# 绘制函数图像
figure(1)
x_plot = linspace(1, 3, 200)
y_plot = x_plot .^ 3 - 2 * x_plot - 5

plot(x_plot, y_plot, "b-")
hold("on")
plot([1 3], [0 0], "k--")  # x轴
plot([x x], [-10 10], "r--")  # 根的位置
scatter(x, f(x), "ro")
hold("off")

xlabel("x")
ylabel("f(x)")
title("f(x) = x³ - 2x - 5")
grid("on")
legend("f(x)", "y=0", "根")
要点:实现牛顿迭代法,包括收敛判断和迭代次数限制。

示例 8:矩阵指数函数

使用泰勒级数近似计算矩阵指数 e^A。

# ===============================================
# 矩阵指数函数(泰勒级数)
# ===============================================
# 计算 exp(A) = I + A + A²/2! + A³/3! + ...

disp("========== 矩阵指数函数 ==========")

# 定义矩阵
A = [0 1; -1 0]  # 这是一个反对称矩阵

disp("矩阵 A:")
disp(A)

# 泰勒级数展开
n_terms = 20  # 级数项数
expA = eye(size(A))  # 初始化为单位矩阵
term = eye(size(A))

disp("计算 exp(A) 的前 " + num2str(n_terms) + " 项...")

for k = 1:n_terms
    term = term * A / k
    expA = expA + term
    
    # 显示前几项
    if k <= 5
        disp("第 " + num2str(k) + " 项后的和:")
        disp(expA)
    end
end

disp("")
disp("最终结果 exp(A):")
disp(expA)

# 对于这个特殊的矩阵,理论值是旋转矩阵
# exp([0 1; -1 0]) = [cos(1) sin(1); -sin(1) cos(1)]
theoretical = [cos(1) sin(1); -sin(1) cos(1)]

disp("理论值:")
disp(theoretical)

disp("误差:")
error = norm(expA - theoretical)
disp(error)
要点:使用泰勒级数计算矩阵函数,展示矩阵幂的递推计算。

示例 9:傅里叶级数近似

使用傅里叶级数近似方波函数。

# ===============================================
# 傅里叶级数近似方波
# ===============================================

disp("========== 傅里叶级数 ==========")

# 定义方波函数
function y = square_wave(x)
    y = zeros(size(x))
    for i = 1:length(x)
        if mod(x(i), 2*pi) < pi
            y(i) = 1
        else
            y(i) = -1
        end
    end
end

# x 轴范围
x = linspace(0, 4*pi, 500)

# 原始方波
y_square = square_wave(x)

# 创建图形
figure(1)
plot(x, y_square, "k-")
hold("on")

# 傅里叶级数近似(不同阶数)
colors = ["r-", "g-", "b-", "m-"]
n_terms_list = [1, 3, 5, 10]

for idx = 1:length(n_terms_list)
    n_terms = n_terms_list(idx)
    
    # 计算傅里叶级数
    y_approx = zeros(size(x))
    for n = 1:n_terms
        k = 2 * n - 1  # 只有奇数项
        y_approx = y_approx + (4/pi) * sin(k * x) / k
    end
    
    plot(x, y_approx, colors(idx))
end

hold("off")
xlabel("x")
ylabel("y")
title("傅里叶级数近似方波")
legend("原始方波", "n=1", "n=3", "n=5", "n=10")
grid("on")

disp("傅里叶级数公式:")
disp("f(x) = (4/π) * Σ[sin((2k-1)x) / (2k-1)]")
disp("")
disp("图形显示不同阶数的近似效果")
disp("阶数越高,近似越精确")
要点:展示级数求和和多条曲线对比,演示吉布斯现象。

示例 10:3D 参数曲线绘制

绘制三维空间中的螺旋线和其他参数曲线。

# ===============================================
# 3D 螺旋线和参数曲线
# ===============================================

disp("========== 3D 参数曲线 ==========")

# 参数范围
t = linspace(0, 4*pi, 200)

# 螺旋线 1:圆柱螺旋
x1 = cos(t)
y1 = sin(t)
z1 = t

# 螺旋线 2:锥形螺旋
r = t / (4*pi)
x2 = r .* cos(t)
y2 = r .* sin(t)
z2 = t

# 绘制第一条螺旋线
figure(1)
plot3(x1, y1, z1, "b-")
xlabel("X 轴")
ylabel("Y 轴")
title("圆柱螺旋线")
grid("on")

disp("已绘制圆柱螺旋线")

# 绘制第二条螺旋线
figure(2)
plot3(x2, y2, z2, "r-")
xlabel("X 轴")
ylabel("Y 轴")
title("锥形螺旋线")
grid("on")

disp("已绘制锥形螺旋线")

# 统计信息
disp("")
disp("曲线统计:")
disp("圆柱螺旋 - 半径恒定为 1")
disp("锥形螺旋 - 半径从 0 增加到 1")
disp("参数范围: t ∈ [0, 4π]")
disp("数据点数: " + num2str(length(t)))
要点:使用 plot3() 函数绘制三维参数曲线,展示空间几何可视化。

示例 11:数据统计分析

对随机数据进行基本的统计分析。

# ===============================================
# 数据统计分析
# ===============================================

disp("========== 数据统计分析 ==========")

# 生成随机数据(正态分布)
n = 1000
data = randn(1, n) * 10 + 50  # 均值50,标准差10

disp("数据集大小: " + num2str(n))

# 基本统计量
data_mean = mean(data)
data_min = min(data)
data_max = max(data)

disp("")
disp("=== 基本统计量 ===")
disp("均值: " + num2str(data_mean))
disp("最小值: " + num2str(data_min))
disp("最大值: " + num2str(data_max))
disp("范围: " + num2str(data_max - data_min))

# 计算方差和标准差
variance = sum((data - data_mean) .^ 2) / (n - 1)
std_dev = sqrt(variance)

disp("")
disp("=== 离散程度 ===")
disp("方差: " + num2str(variance))
disp("标准差: " + num2str(std_dev))

# 分位数
sorted_data = sort(data)
q1_idx = floor(n * 0.25)
q2_idx = floor(n * 0.50)
q3_idx = floor(n * 0.75)

q1 = sorted_data(q1_idx)
q2 = sorted_data(q2_idx)  # 中位数
q3 = sorted_data(q3_idx)

disp("")
disp("=== 分位数 ===")
disp("第一四分位数 (Q1): " + num2str(q1))
disp("中位数 (Q2): " + num2str(q2))
disp("第三四分位数 (Q3): " + num2str(q3))
disp("四分位距 (IQR): " + num2str(q3 - q1))

# 绘制数据分布
figure(1)
plot(1:n, sorted_data, "b.")
hold("on")
plot([1 n], [data_mean data_mean], "r-")
plot([1 n], [q2 q2], "g--")
hold("off")
xlabel("索引")
ylabel("数值")
title("数据分布图")
legend("排序数据", "均值", "中位数")
grid("on")

disp("")
disp("统计分析完成!")
要点:演示描述性统计分析,包括集中趋势、离散程度和分位数计算。

更多示例

以上示例涵盖了 TianYuan 的主要功能领域:

  • 基础运算:矩阵操作、向量运算
  • 线性代数:方程组求解、特征值分析
  • 数值计算:积分、求根、级数展开
  • 数据拟合:最小二乘法、多项式拟合
  • 可视化:2D/3D 图形绘制
  • 统计分析:描述性统计、数据处理

这些示例可以作为学习的起点,您可以根据实际需求进行修改和扩展。

运行建议

💡 学习建议

  1. 从简单的示例开始,逐步理解语法和概念
  2. 尝试修改参数,观察输出的变化
  3. 在理解示例的基础上,编写自己的变体
  4. 组合不同示例的技术,解决更复杂的问题

🔧 调试技巧

  • 使用 disp() 输出中间结果
  • 检查矩阵维度是否匹配
  • 注意索引从 1 开始
  • 使用 size() 查看矩阵尺寸
  • 使用 ismatrix()/isscalar()/iscell()/isstruct() 检查变量类型