如何编写Python类实现给定方程及n-1个变量值时自动求解剩余缺失变量
实现方案
你可以基于SymPy封装通用的自动求解类,完全不需要重复编写公式,也不用写大量条件判断逻辑,核心思路是预定义所有涉及的变量为符号对象,将公式统一存储为等式结构,每次传入参数后自动识别未知量、调用求解器完成计算。
依赖安装
pip install sympy
单方程示例(摄氏度-华氏度转换)
from sympy import symbols, Eq, solve class TempConversion: # 预定义所有变量 C, F = symbols("C F") # 只需要编写一次公式 EQUATIONS = [ Eq(F, 9/5 * C + 32) ] def __init__(self, **kwargs): # 收集已知变量的取值 known_vars = kwargs # 找到所有未传入的未知变量 unknown_vars = [var for var in [self.C, self.F] if str(var) not in known_vars] # 自动求解 solutions = solve(self.EQUATIONS, unknown_vars, dict=True)[0] # 把所有变量的结果写入实例属性 all_vars = {**known_vars, **{str(k): v for k, v in solutions.items()}} for k, v in all_vars.items(): setattr(self, k, float(v))
使用示例
# 传入摄氏度求华氏度 temp1 = TempConversion(C=25) print(temp1.F) # 输出 77.0 # 传入华氏度求摄氏度 temp2 = TempConversion(F=77) print(temp2.C) # 输出 25.0
多变量/方程组扩展示例(理想气体状态方程)
只需要修改类的变量和方程定义即可,求解逻辑完全复用:
from sympy import symbols, Eq, solve class IdealGasLaw: # 压强P、体积V、物质的量n、气体常数R、温度T P, V, n, R, T = symbols("P V n R T") # 只写一次方程 EQUATIONS = [ Eq(P*V, n*R*T), # 可以继续加更多关联方程,自动支持方程组求解 Eq(R, 8.314) # 固定气体常数,可省略传参 ] def __init__(self, **kwargs): known_vars = kwargs all_symbols = [self.P, self.V, self.n, self.R, self.T] unknown_vars = [var for var in all_symbols if str(var) not in known_vars] solutions = solve(self.EQUATIONS, unknown_vars, dict=True)[0] all_vars = {**known_vars, **{str(k): v for k, v in solutions.items()}} for k, v in all_vars.items(): setattr(self, k, float(v))
使用示例
# 已知n=1mol,V=1m³,T=273.15K,求压强 gas = IdealGasLaw(n=1, V=1, T=273.15) print(gas.P) # 输出约 2269.7
内容的提问来源于stack exchange,提问作者stat_is_quo
相关产品推荐
相关产品推荐

