范德蒙矩阵
A = vander(v) 返回范德蒙矩阵,以使其列是向量v的幂.
v - 输入, 数值向量, 支持复数
示例1:多项式拟合与插值
生成实验数据点
x_data = np.array([1, 2, 3, 4, 5])
y_data = np.array([2.1, 7.9, 20.1, 40.2, 69.8]) # 近似 y = 2x^2 + x + 1
构建范德蒙矩阵进行二次多项式拟合
vander_matrix = vander(x_data)
范德蒙矩阵:
print(vander_matrix)
#[[1, 1, 1, 1, 1],
[16, 8, 4, 2, 1],
[81, 27, 9, 3, 1],
[256, 64, 16, 4, 1],
[625, 125, 25, 5, 1]]
求解多项式系数:V * c = y
coeffs = np.linalg.lstsq(np.array(vander_matrix).astype(float), y_data, rcond=None)[0]
print(f"\n拟合多项式系数: {coeffs}")
#拟合多项式系数: [0.00416667,0.20833333,1.84583333,-1.25833333,1.3]
print("拟合多项式: y = {:.2f}x² + {:.2f}x + {:.2f}".format(coeffs[0], coeffs[1], coeffs[2]))
#拟合多项式: y = 0.00x² + 0.21x + 1.85
示例2:数字信号处理 - 滤波器设计
设计线性相位FIR滤波器
在特定频率点指定幅度响应
frequencies = np.array([0, 0.2, 0.4, 0.6, 0.8, 1.0]) # 归一化频率
desired_response = np.array([1, 0.8, 0.3, 0.1, 0.05, 0]) # 期望幅度
使用范德蒙矩阵构建多项式逼近问题
vander_freq = vander(frequencies)
频率点范德蒙矩阵:
print(vander_freq)
#[[0, 0, 0, 0, 0, 1],
[0.00032, 0.0016, 0.008, 0.04, 0.2, 1],
[0.01024, 0.0256, 0.064, 0.16, 0.4, 1],
[0.07776, 0.1296, 0.216, 0.36, 0.6, 1],
[0.32768, 0.4096, 0.512, 0.64, 0.8, 1],
[1, 1, 1, 1, 1, 1]]
求解滤波器系数(最小二乘逼近)
filter_coeffs = np.linalg.lstsq(np.array(vander_freq).astype(float),
desired_response, rcond=None)[0]
print(f"\nFIR滤波器系数: {filter_coeffs}")
#FIR滤波器系数: [19.53125,-58.59375,63.28125,-27.65625,2.4375,1]
示例3:金融工程 - 收益率曲线建模
不同期限的零息债券收益率
maturities = np.array([0.25, 0.5, 1, 2, 5, 10]) # 年
spot_rates = np.array([0.02, 0.022, 0.025, 0.028, 0.032, 0.035]) # 即期利率
使用多项式模型拟合收益率曲线
vander_maturities = vander(maturities)
期限范德蒙矩阵:
print(vander_maturities)
#[[0.0009765625, 0.00390625, 0.015625, 0.0625, 0.25, 1],
[0.03125, 0.0625, 0.125, 0.25, 0.5, 1],
[1, 1, 1, 1, 1, 1],
[32, 16, 8, 4, 2, 1],
[3125, 625, 125, 25, 5, 1],
[100000, 10000, 1000, 100, 10, 1]]
多项式拟合收益率曲线
rate_coeffs = np.linalg.lstsq(np.array(vander_maturities).astype(float),
spot_rates, rcond=None)[0]
print(f"\n收益率曲线多项式系数: {rate_coeffs}")
#收益率曲线多项式系数: [-2.78045541e-06,1.82025577e-05,3.39628451e-04,-3.29410064e-03,1.03180585e-02,1.76209916e-02]
示例4:控制系统 - 特征值配置
期望的闭环极点位置
desired_poles = np.array([-1, -2, -3]) # 稳定系统的极点
构建特征多项式:∏(s - p_i) = s^n + a_{n-1}s^{n-1} + ... + a_0
使用范德蒙矩阵建立极点与多项式系数的关系
vander_poles = vander(desired_poles)
极点范德蒙矩阵:
print(vander_poles)
#[[1, -1, 1],
[4, -2, 1],
[9, -3, 1]]
对于单输入系统,可以计算状态反馈增益
这里演示多项式系数的提取
poly_coeffs = np.ones(len(desired_poles) + 1) # 首项系数为1
实际应用中会结合可控性矩阵进行完整计算
print(f"\n期望特征多项式系数(参考): {poly_coeffs}")
#期望特征多项式系数(参考): [1. 1. 1. 1.]
#系统可通过状态反馈配置到期望极点
示例5:图像处理 - 几何变换校正
控制点:原始图像坐标 -> 校正后坐标
src_points = np.array([[10, 10], [100, 15], [15, 90], [95, 95]]) # 畸变点
dst_points = np.array([[0, 0], [100, 0], [0, 100], [100, 100]]) # 校正点
使用二次多项式模型校正几何畸变
构建扩展坐标(包含二次项)
src_x, src_y = src_points[:, 0], src_points[:, 1]
为x方向变换构建范德蒙矩阵
vander_src = vander(src_points.flatten())
控制点坐标范德蒙矩阵(部分):
print(vander_src[:4, :6]) # 显示前4行前6列
#[[10000000, 1000000, 100000, 10000, 1000, 100],
[10000000, 1000000, 100000, 10000, 1000, 100],
[100000000000000, 1000000000000, 10000000000, 100000000, 1000000, 10000],
[170859375, 11390625, 759375, 50625, 3375, 225]]
实际应用中会构建更大的系统来求解变换参数
通过求解超定系统可获得几何变换参数
可校正镜头畸变、透视变形等
# Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
# Licensed under the MIT License.
import sympy as sp
import numpy as np
def vander_type_matrix(input_str):
"""
生成范德蒙矩阵 (对标 MATLAB 的 vander 函数)
参数:
input_str (str): 数学表达式字符串,支持以下形式:
- 向量: 如 "[1,2,3]" 或 "[[1],[2],[3]]"(行/列向量均可)
生成的矩阵列顺序为 [x^(n-1), x^(n-2), ..., x^0]
返回:
sp.Matrix or str:
- 成功时返回 SymPy 矩阵
- 失败时返回错误信息字符串 (以"错误:"开头)
示例:
>>> vander_type_matrix("[1, 2, 3]")
Matrix([
[1, 1, 1],
[4, 2, 1],
[9, 3, 1]])
>>> vander_type_matrix("[[1], [2], [3]]") # 列向量输入
Matrix([
[1, 1, 1],
[4, 2, 1],
[9, 3, 1]])
>>> vander_type_matrix("5") # 标量视为单元素向量
Matrix([[1]])
"""
try:
expr = sp.sympify(input_str)
error = False
result = None
def validate_vector(A):
"""验证输入是否为有效向量并转换为 numpy 数组"""
# 检查矩阵维度
rows, cols = A.shape
if rows > 1 and cols > 1:
raise ValueError("输入必须为向量(行或列数为1)")
# 尝试转换为数值数组
try:
x = np.array(A, dtype=float).ravel()
except TypeError:
raise ValueError("元素必须为数值类型")
return x
# 处理标量输入(视为单元素向量)
if expr.is_Number:
result = np.vander([float(expr)], increasing=False)
else:
error = True
return sp.Matrix(result.tolist()) if not error else f"输入错误: {input_str}"
except Exception as e:
return f"错误: {str(e)}"
# 标量输入
print(vander_type_matrix("6"))
# Matrix([[1.00000000000000]])
方差
V = var(A) 返回A中沿大小不等于1的第一个数组维度的元素的方差.
如果A是一个观测值向量,则方差为标量.
V = var(A,w) 指定权重方案.如果w=0(默认值),则V按观测值数量-1实现归一化.如果w=1,则它按观测值数量实现归一化. w也可以是包含非负元素的权重向量.在这种情况下,w的长度必须等于var将作用于的维度的长度.
A - 输入数组, 向量, 矩阵
w - 粗细, 0,1,向量
示例1:投资组合风险评估
不同资产的日收益率数据(行:时间,列:资产)
portfolio_returns = np.array([
[0.02, 0.015, 0.025, 0.018], # 第1天
[-0.01, 0.008, 0.012, 0.005], # 第2天
[0.015, 0.022, -0.005, 0.01], # 第3天
[0.008, -0.003, 0.018, 0.015], # 第4天
[-0.005, 0.012, 0.008, -0.002] # 第5天
])
计算各资产收益率的样本方差(风险评估)
asset_variances = var(portfolio_returns)
计算总体方差(不同视角)
population_variances = var(portfolio_returns, 1)
各资产收益率的样本方差(风险评估):
for i, var in enumerate(asset_variances):
print(f" 资产{i + 1}: {float(var):.6f}")
# 资产1: 0.000164
# 资产2: 0.000086
# 资产3: 0.000127
# 资产4: 0.000064
各资产收益率的总体方差:
for i, var in enumerate(population_variances):
print(f" 资产{i + 1}: {float(var):.6f}")
#资产1: 0.000131
#资产2: 0.000069
#资产3: 0.000102
#资产4: 0.000051
风险排序
risk_ranking = np.argsort(asset_variances)[::-1] # 从高到低
print(f"\n风险从高到低排序: {[f'资产{i + 1}' for i in risk_ranking]}")
#风险从高到低排序: ['资产1', '资产3', '资产2', '资产4']
示例2:教育评估中的成绩分析
不同班级的学生成绩(行:学生,列:科目)
class_a_scores = np.array([
[85, 90, 88, 92],
[78, 85, 80, 88],
[92, 88, 95, 90],
[80, 82, 78, 85],
[88, 90, 92, 87]
])
class_b_scores = np.array([
[75, 80, 78, 82],
[82, 85, 80, 88],
[90, 87, 92, 89],
[85, 80, 83, 86],
[78, 75, 80, 79]
])
计算各科目的成绩方差
var_a = var(class_a_scores)
var_b = var(class_b_scores)
subjects = ['数学', '物理', '化学', '生物']
班级A各科目成绩方差:
for subj, var in zip(subjects, var_a):
print(f" {subj}: {float(var):.2f}")
# 数学: 32.80
# 物理: 12.00
# 化学: 54.80
# 生物: 7.30
班级B各科目成绩方差:
for subj, var in zip(subjects, var_b):
print(f" {subj}: {float(var):.2f}")
# 数学: 34.50
# 物理: 22.30
# 化学: 30.80
# 生物: 17.70
方差分析:比较两个班级的成绩稳定性
班级间方差比较:
for i, (va, vb) in enumerate(zip(var_a, var_b)):
ratio = float(va) / float(vb) if float(vb) > 0 else float('inf')
comparison = "A更稳定" if ratio < 0.8 else "B更稳定" if ratio > 1.2 else "相当"
print(f" {subjects[i]}: 方差比={ratio:.2f} ({comparison})")
# 数学: 方差比=0.95 (相当)
# 物理: 方差比=0.54 (A更稳定)
# 化学: 方差比=1.78 (B更稳定)
# 生物: 方差比=0.41 (A更稳定)
# Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
# Licensed under the MIT License.
import sympy as sp
import numpy as np
def variance_array(input_str):
"""
对标 MATLAB 的 var 函数,计算矩阵的方差。
参数:
input_str: 输入的字符串表达式,可以是矩阵或元组形式。
例如:
- "[[1,2], [3,4]]":计算样本方差(默认 ddof=1)
- "([[1,2], [3,4]], 0)":计算样本方差(ddof=1)
- "([[1,2], [3,4]], 1)":计算总体方差(ddof=0)
- "([[1,2], [3,4]], [1,1])":加权方差(权重为 [1,1])
返回:
SymPy 矩阵表示的方差结果或错误信息。
"""
try:
expr = sp.sympify(input_str)
error = False
result = None
M = None
weight = None
ddof = None # 方差计算的自由度调整,对应 np.var 的 ddof 参数
# 解析输入表达式
if isinstance(expr, tuple):
if len(expr) != 2:
error = True
else:
m_part, w_part = expr
# 转换为矩阵
M = sp.Matrix(m_part) if isinstance(m_part, list) else None
if M is None:
error = True
else:
# 处理第二个参数:权重或 ddof 标志
if isinstance(w_part, (int, sp.Integer)):
# MATLAB 中 0 表示样本方差(N-1),1 表示总体方差(N)
w_val = int(w_part)
if w_val in [0, 1]:
ddof = 1 - w_val # 转换为 np.var 的 ddof 参数
else:
error = True
else:
# 尝试转换为权重向量
W = sp.Matrix(w_part) if isinstance(w_part, list) else None
if W is not None:
W_np = np.array(W, dtype=float)
# 检查权重是否与数据行数匹配
if W_np.size == M.shape[0]:
weight = W_np.flatten()
else:
error = True
else:
error = True
else:
# 单个矩阵输入,默认使用样本方差(ddof=1)
M = sp.Matrix(expr) if isinstance(expr, list) else None
if M is not None:
ddof = 1
else:
error = True
if not error and M is not None:
data = np.array(M, dtype=float)
if weight is not None:
# 计算加权方差
weighted_mean = np.average(data, axis=0, weights=weight)
result = np.average((data - weighted_mean) ** 2, axis=0, weights=weight)
elif ddof is not None:
# 计算普通方差
result = np.var(data, axis=0, ddof=ddof)
else:
error = True
else:
error = True
return sp.sympify(result) if not error else f"输入错误: {input_str}"
except Exception as e:
return f"错误: {e}"
# 示例代码
if __name__ == "__main__":
# 示例 1: 样本方差(默认,ddof=1)
input1 = "[[1,2], [3,4]]"
print(f"示例1 {input1} 的结果:")
print(variance_array(input1))
# [2.0, 2.0]
# 示例 2: 总体方差(ddof=0)
input2 = "([[1,2], [3,4]], 1)"
print(f"\n示例2 {input2} 的结果:")
print(variance_array(input2))
# [1.0, 1.0]
# 示例 3: 加权方差(权重为 [1,1])
input3 = "([[1,2], [3,4]], [1,1])"
print(f"\n示例3 {input3} 的结果:")
print(variance_array(input3))
# [1.0, 1.0]
向量范数
N = vecnorm(A) 返回 A 的 2-范数或欧几里德范数:
如果 A 是向量,则 vecnorm 返回该向量的范数。
如果 A 是矩阵,则 vecnorm 返回每一列的范数。
N = vecnorm(A,p) 计算广义向量 p-范数。
N = vecnorm(A,p,dim) 沿维度 dim 运算。此维度的大小将减少至 1,而所有其他维度的大小保持不变。
示例1:信号处理中的能量分析
模拟信号数据(行:时间点,列:信号通道)
signal_data = np.array([
[0.1, 0.2, 0.05], # 时刻1
[0.3, 0.1, 0.15], # 时刻2
[0.2, 0.4, 0.1], # 时刻3
[0.4, 0.3, 0.25], # 时刻4
[0.1, 0.2, 0.05] # 时刻5
])
计算各信号通道的2-范数(能量范数)
signal_energies = vecnorm(signal_data, 2, 1)
计算无穷范数(峰值)
signal_peaks = vecnorm(signal_data, oo, 1)
计算1-范数(绝对值和)
signal_abs_sums = vecnorm(signal_data, 1, 1)
各信号通道分析:
channels = ['通道1', '通道2', '通道3']
for i, channel in enumerate(channels):
energy = float(signal_energies[0, i])
peak = float(signal_peaks[0, i])
abs_sum = float(signal_abs_sums[0, i])
print(f" {channel}:")
print(f" 能量(2-范数): {energy:.4f}")
print(f" 峰值(∞-范数): {peak:.4f}")
print(f" 绝对和(1-范数): {abs_sum:.4f}")
# 通道1:
# 能量(2-范数): 0.5568
# 峰值(∞-范数): 0.4000
# 绝对和(1-范数): 1.1000
# 通道2:
# 能量(2-范数): 0.5831
# 峰值(∞-范数): 0.4000
# 绝对和(1-范数): 1.2000
# 通道3:
# 能量(2-范数): 0.3162
# 峰值(∞-范数): 0.2500
# 绝对和(1-范数): 0.6000
示例2:机器学习中的特征归一化
原始特征数据(行:样本,列:特征)
raw_features = np.array([
[100, 2.5, 0.8], # 样本1
[150, 1.8, 0.6], # 样本2
[80, 3.2, 0.9], # 样本3
[200, 1.5, 0.4], # 样本4
[120, 2.8, 0.7] # 样本5
])
计算每个特征的2-范数(用于归一化)
feature_norms = vecnorm(raw_features, 2, 1)
原始特征范数:
feature_names = ['特征A', '特征B', '特征C']
for i, name in enumerate(feature_names):
norm_val = float(feature_norms[0, i])
print(f" {name}: {norm_val:.4f}")
#原始特征范数:
# 特征A: 305.4505
# 特征B: 5.4608
# 特征C: 1.5684
特征归一化(L2归一化)
normalized_features = raw_features / np.array([float(x) for x in feature_norms[0, :]])
验证归一化后的范数
normalized_norms = vecnorm(normalized_features, 2, 1)
归一化后特征范数:
for i, name in enumerate(feature_names):
norm_val = float(normalized_norms[0, i])
print(f" {name}: {norm_val:.4f} {'✓' if abs(norm_val - 1.0) < 1e-10 else '✗'}")
#归一化后特征范数:
# 特征A: 1.0000 ✓
# 特征B: 1.0000 ✓
# 特征C: 1.0000 ✓
计算样本间的余弦相似度
样本间余弦相似度(基于归一化特征):
for i in range(len(normalized_features)):
for j in range(i + 1, len(normalized_features)):
# 余弦相似度 = 归一化向量的点积
similarity = np.dot(normalized_features[i], normalized_features[j])
print(f" 样本{i + 1}与样本{j + 1}: {similarity:.4f}")
#样本1与样本2: 0.5068
#样本1与样本3: 0.6467
#样本1与样本4: 0.4702
#样本1与样本5: 0.5910
#样本2与样本3: 0.5413
#样本2与样本4: 0.5096
#样本2与样本5: 0.5327
#样本3与样本4: 0.4788
#样本3与样本5: 0.6595
#样本4与样本5: 0.5119
# Copyright 2025 小塔立软件有限公司及其旗下网站:www.qikjik.com
# Licensed under the MIT License.
import sympy as sp
from sympy import sympify, oo, Max, Min
def vector_norm(input_str):
"""
计算向量或矩阵的范数,类似于MATLAB的vecnorm函数。
参数:
input_str (str): 输入的字符串,代表vecnorm的参数,例如 "A, p, dim"。
返回:
sympy.Array 或 sympy.Expr: 计算得到的范数结果(标量、行向量或列向量)。
异常:
ValueError: 如果输入无法解析或参数无效。
"""
try:
# 解析输入字符串为参数元组
args = sympify(input_str)
if not isinstance(args, tuple):
args = (args,)
# 处理第一个参数 A
if len(args) == 0:
raise ValueError("至少需要一个输入参数")
A = sp.Array(args[0]) if isinstance(args[0], list) else None
if A is None:
raise ValueError("第一个参数必须是有效的矩阵或可以转换为矩阵的形式")
# 判断是否为向量(一维数组)
is_vector = len(A.shape) == 1
if not is_vector and len(A.shape) != 2:
raise ValueError("输入必须是向量或二维矩阵")
# 处理 p 参数(范数类型)
p = 2
if len(args) >= 2:
p = args[1]
# 处理 dim 参数(计算维度)
dim = 1
if len(args) >= 3:
dim = args[2]
if dim not in (1, 2):
raise ValueError("dim 参数必须是 1 或 2")
# 计算向量范数
if is_vector:
elements = A
if p == oo: # 无穷范数 (最大值)
norm = Max(*[abs(x) for x in elements])
elif p == -oo: # 负无穷范数 (最小值)
norm = Min(*[abs(x) for x in elements])
else: # p-范数
norm = sum(abs(x) ** p for x in elements) ** (1 / p)
return norm.evalf() # 计算数值结果
# 计算矩阵范数
else:
m, n = A.shape # 使用 shape 属性获取维度
norms = []
# 按列计算 (dim=1)
if dim == 1:
for j in range(n):
col = A[:, j]
if p == oo:
col_norm = Max(*[abs(x) for x in col])
elif p == -oo:
col_norm = Min(*[abs(x) for x in col])
else:
col_norm = sum(abs(x) ** p for x in col) ** (1 / p)
norms.append(col_norm.evalf()) # 计算数值结果
return sp.Array(norms).reshape(1, n) # 行向量
# 按行计算 (dim=2)
else:
for i in range(m):
row = A[i, :]
if p == oo:
row_norm = Max(*[abs(x) for x in row])
elif p == -oo:
row_norm = Min(*[abs(x) for x in row])
else:
row_norm = sum(abs(x) ** p for x in row) ** (1 / p)
norms.append(row_norm.evalf()) # 计算数值结果
return sp.Array(norms).reshape(m, 1) # 列向量
except Exception as e:
raise ValueError(f"错误发生:{str(e)}")
# 测试示例
if __name__ == "__main__":
# 示例1:计算向量的2-范数
vector = [1, 2, 3]
print("向量范数:", vector_norm(f"{vector}, 2"))
# 3.74165738677394
# 示例2:计算矩阵的列2-范数
matrix = [[1, 2], [3, 4]]
result = vector_norm(f"{matrix}, 2, 1")
print("矩阵列范数:", result)
# [[3.16227766016838, 4.47213595499958]]
# 示例3:计算矩阵的行无穷范数
result = vector_norm(f"{matrix}, oo, 2")
print("矩阵行无穷范数:", result)
# [[2.0], [4.0]]
向量密度图
VectorDensityPlot(expression1,...)向量场图 和 密度着色图 的结合体。它在一个二维平面上,同时使用两种视觉元素来呈现一个向量场(例如风速场、流体流速场、电磁场).
1. 流体力学与涡旋场:
经典涡旋:顺时针旋转流场,等强度同心圆环
VectorDensityPlot(-y, x)
剪切流:水平流速随y轴正弦变化,产生层状剪切
VectorDensityPlot(sin(y), 0)
2. 电磁场与势场:
磁偶极子: 双极磁场线,从N极到S极
VectorDensityPlot(2*x*y, y^2 - x^2)
均匀电场: 垂直方向强度随x变化的电场
VectorDensityPlot(0, cos(x))
电荷阵列: 周期性正负电荷分布的电场
VectorDensityPlot(sin(x)cos(y), cos(x)sin(y))
3. 非线性动力学:
极限环: 单位圆环吸引子,内部向外流/外部向内流
VectorDensityPlot(y + x*(1-x^2-y^2), -x + y*(1-x^2-y^2))
鞍点场: X方向发散/Y方向收敛的典型鞍点
VectorDensityPlot(x, -y)
混沌系统: 扭曲的螺旋轨迹,具有多个不稳定焦点
VectorDensityPlot(sin(y) - 0.3*x, cos(x) + 0.3*y)
4. 数学特殊场:
梯度场: 标量场 f(x,y)=sin(x)cos(y) 的梯度
VectorDensityPlot(cos(x)cos(y), -sin(x)sin(y))
哈密顿系统: 守恒系统,沿椭圆/双曲线流动
VectorDensityPlot(y^2 - x^2, 2*x*y)
分形场: 高频振荡产生的自相似结构
VectorDensityPlot(sin(2y) - cos(3x), sin(3x) + cos(2y))
5. 自然现象模拟:
地转风场: 科里奥利力作用下的气旋流场
VectorDensityPlot(-y/(x^2+y^2+1), x/(x^2+y^2+1))
心脏电传导: 从原点向外扩散的兴奋波
VectorDensityPlot(x*exp(-x^2-y^2), y*exp(-x^2-y^2))
星系旋臂: 微分旋转的星系盘流场
VectorDensityPlot(-y/(1+x^2), x/(1+y^2))
VectorPlot(u(x,y), v(x,y))
VectorPlot(u(x,y,T), v(x,y,T))
通过在空间(通常是平面)上规则或不规则分布的采样点处绘制箭头来表示向量场. 多维空间(通常是2D或3D)中每一点上都有一个向量的情况。它直观地展现了某种“方向”和“强度”在空间中的分布。
箭头的方向:精确地表示该点处向量的方向。
箭头的长度(有时也用颜色或箭头粗细辅助表示):表示该点处向量的大小(模)。长度越长(或颜色越暖/越深),表示向量越大.
x, y -- 空间坐标
T -- 动画参数
向量场图
1. 流体力学与涡旋场:
经典涡旋:顺时针旋转流场,等强度同心圆环
VectorPlot(-y, x)
剪切流:水平流速随y轴正弦变化,产生层状剪切
VectorPlot(sin(y), 0)
2. 电磁场与势场:
磁偶极子: 双极磁场线,从N极到S极
VectorPlot(2*x*y, y^2 - x^2)
均匀电场: 垂直方向强度随x变化的电场
VectorPlot(0, cos(x))
电荷阵列: 周期性正负电荷分布的电场
VectorPlot(sin(x)cos(y), cos(x)sin(y))
3. 非线性动力学:
极限环: 单位圆环吸引子,内部向外流/外部向内流
VectorPlot(y + x*(1-x^2-y^2), -x + y*(1-x^2-y^2))
鞍点场: X方向发散/Y方向收敛的典型鞍点
VectorPlot(x, -y)
混沌系统: 扭曲的螺旋轨迹,具有多个不稳定焦点
VectorPlot(sin(y) - 0.3*x, cos(x) + 0.3*y)
4. 数学特殊场:
梯度场: 标量场 f(x,y)=sin(x)cos(y) 的梯度
VectorPlot(cos(x)cos(y), -sin(x)sin(y))
哈密顿系统: 守恒系统,沿椭圆/双曲线流动
VectorPlot(y^2 - x^2, 2*x*y)
分形场: 高频振荡产生的自相似结构
VectorPlot(sin(2y) - cos(3x), sin(3x) + cos(2y))
5. 自然现象模拟:
地转风场: 科里奥利力作用下的气旋流场
VectorPlot(-y/(x^2+y^2+1), x/(x^2+y^2+1))
心脏电传导: 从原点向外扩散的兴奋波
VectorPlot(x*exp(-x^2-y^2), y*exp(-x^2-y^2))
星系旋臂: 微分旋转的星系盘流场
VectorPlot(-y/(1+x^2), x/(1+y^2))
时变向量场图
1. 流体动力学模拟:
旋转流场: 中心旋涡强度周期性变化,产生脉动旋转
VectorPlot(-y, x + sin(T))
行波流场: X/Y方向独立传播的正弦波形成移动的网格图案
VectorPlot(sin(x-T), cos(y+T))
双涡旋对流: 两个反向涡旋周期性增强/减弱
VectorPlot(sin(x)*cos(y+T) - 0.5*y,cos(x+T)*sin(y) + 0.5*x)
2. 电磁场模拟:
行波磁场: 磁场线以波的形式向右上角传播
VectorPlot(-sin(y-T), cos(x+T))
3. 相空间动力学:
混沌吸引子: 参数T变化导致规则流→混沌流的转变
VectorPlot(sin(y) + T*cos(x),cos(x) - T*sin(y))
分岔流场: T增加时出现霍普夫分岔(焦点→极限环)
VectorPlot(T*x - y - x*(x²+y²),x + T*y - y*(x²+y²))
4. 特殊效果场:
螺旋波发射: 从原点发射的螺旋波阵面
VectorPlot(-y + T*cos(x), x + T*sin(y))
向量场三维图
VectorPlot3D(f(x),f(y),f(z))在三维空间的每一个点上,都有一个箭头(或其它标记),箭头的方向表示向量场在该点的方向,箭头的长度和颜色通常表示该点向量的大小(模)。
1. 电偶极子的电场 (Electrodynamics)
这是经典电磁学中的一个基础模型。一个正电荷和一个负电荷相隔一小段距离,它们共同产生的电场就是一个向量场。
数学描述: 正电荷在 (0, 0, d),负电荷在 (0, 0, -d)。空间任意一点 (x, y, z) 的电场强度 E 是两个点电荷电场的矢量叠加。
VectorPlot3D(-x/((x^2+y^2+z^2+0.3)^(3/2)),-y/((x^2+y^2+z^2+0.3)^(3/2)),2z/((x^2+y^2+z^2+0.3)^(3/2)),x=[-2,2],y=[-2,2],z=[-2,2])
2. 流体速度场:涡流 (Fluid Dynamics)
想象一个沿着 z 轴旋转的涡流,比如龙卷风或搅拌杯子中的水。流体的速度方向是切向的。
数学描述: 速度向量 v 在点 (x, y, z) 的分量为 {-y, x, 0}。
这个向量在 XY 平面内总是垂直于位置向量 (x, y),从而形成旋转。Z 分量为 0 表示没有垂直运动(这是一个理想的平面涡流)。
VectorPlot3D(-y,x,z,x=[-1,1],y=[-1,1],z=[-0.5,0.5])
3. 引力场 (Newtonian Gravity)
一个均匀球体(如地球)产生的引力场。
数学描述: 根据万有引力定律,引力指向球心,其大小与到球心距离的平方成反比。
在点 (x, y, z) 的引力向量 g ∝ {-x, -y, -z} / (x^2 + y^2 + z^2)^(3/2)
VectorPlot3D(-x/((x^2+y^2+z^2+0.1)^(3/2)),-y/((x^2+y^2+z^2+0.1)^(3/2)),-z/((x^2+y^2+z^2+0.1)^(3/2)),x=[-2,2],y=[-2,2],z=[-2,2])