完整示例程序
本章提供一系列完整的 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 图形绘制
- 统计分析:描述性统计、数据处理
这些示例可以作为学习的起点,您可以根据实际需求进行修改和扩展。
运行建议
💡 学习建议
- 从简单的示例开始,逐步理解语法和概念
- 尝试修改参数,观察输出的变化
- 在理解示例的基础上,编写自己的变体
- 组合不同示例的技术,解决更复杂的问题
🔧 调试技巧
- 使用
disp()输出中间结果 - 检查矩阵维度是否匹配
- 注意索引从 1 开始
- 使用
size()查看矩阵尺寸 - 使用
ismatrix()/isscalar()/iscell()/isstruct()检查变量类型