如何从列表创建SymPy符号以实现高斯误差传播?
符号创建与高斯误差传播实现
问题需求
需将符号列表['C_k', 'c_f', 'm_1', 'T_1', 'T_m']中的每个元素转为SymPy符号,最终用于高斯误差传播——计算表达式在给定点的偏导数。现有代码已完成LaTeX公式到SymPy表达式的转换,并提取出表达式中的符号列表,需补充符号创建与导数计算环节。
现有代码
import matplotlib.pyplot as plt from latex2sympy2 import latex2sympy import numpy as np from sympy import * import re # 任务:针对给定公式和带不确定度的数据集执行误差传播 Formula = r'(m_1\cdot c_f+C_k)\cdot (T_1-T_m)' # 输入LaTeX格式的公式 Formula = latex2sympy(Formula) # 转换为SymPy表达式 # 通过正则提取表达式中的符号列表 symbol_list = re.findall(r'[A-Za-z_]+\d*', str(Formula)) print(symbol_list) # 输出:['C_k', 'c_f', 'm_1', 'T_1', 'T_m']
实现步骤
1. 创建SymPy符号
利用symbols()函数,将符号列表拼接为空格分隔的字符串传入,或直接通过字典映射符号名与对象(方便后续按名称调用):
# 方式1:生成符号元组 symbols_tuple = symbols(' '.join(symbol_list)) # 方式2:生成符号字典(推荐,便于按名称调用) symbols_dict = {name: symbols(name) for name in symbol_list}
2. 计算偏导数(高斯误差传播核心)
遍历符号列表,对每个符号求表达式的偏导,再代入具体数值计算:
# 计算每个符号的偏导数 derivatives = {} for name, symbol in symbols_dict.items(): derivatives[name] = diff(Formula, symbol) # 模拟测量点的数值 point_values = { 'C_k': 10, 'c_f': 0.5, 'm_1': 2, 'T_1': 30, 'T_m': 20 } # 在给定点计算各偏导的浮点结果 derivative_values = {} for name, deriv in derivatives.items(): derivative_values[name] = deriv.subs(point_values).evalf() print("各符号的偏导数值:") for name, val in derivative_values.items(): print(f"{name}: {val}")
完整代码示例
import matplotlib.pyplot as plt from latex2sympy2 import latex2sympy import numpy as np from sympy import * import re # 任务:针对给定公式和带不确定度的数据集执行误差传播 Formula = r'(m_1\cdot c_f+C_k)\cdot (T_1-T_m)' # 输入LaTeX格式的公式 Formula = latex2sympy(Formula) # 转换为SymPy表达式 # 通过正则提取表达式中的符号列表 symbol_list = re.findall(r'[A-Za-z_]+\d*', str(Formula)) print("提取的符号列表:", symbol_list) # 创建符号字典,映射符号名与SymPy符号对象 symbols_dict = {name: symbols(name) for name in symbol_list} # 计算每个符号的偏导数 derivatives = {name: diff(Formula, symbol) for name, symbol in symbols_dict.items()} # 模拟测量点数值 point_values = { 'C_k': 10, 'c_f': 0.5, 'm_1': 2, 'T_1': 30, 'T_m': 20 } # 计算给定点的偏导数值 derivative_values = {name: deriv.subs(point_values).evalf() for name, deriv in derivatives.items()} print("\n各符号的偏导数值:") for name, val in derivative_values.items(): print(f"{name}: {val}")
内容的提问来源于stack exchange,提问作者Maris Baier
相关产品推荐
相关产品推荐

