SymPy向量值函数如何批量替换参数并解决浮点转换报错?
报错原因
TypeError: can't convert expression to float报错是因为subs()方法返回的是SymPy表达式类型,无法直接存入numpy的float数组,需要显式转换为数值类型。对于参数和分量规模大的场景,循环调用subs效率极低,更推荐用内置的批量转换方法完成赋值。
解决方案
方案1:快速修复现有代码
只需在subs后添加float()转换即可运行:
import sympy as sym import numpy as np s,t,v,w,q,e,r,m,b,a = sym.symbols ('s,t,v,w,q,e,r,m,b,a') f_vector = [ s+t, s, v-2, w-a, q, r, e, a-7, b-m, t ] parameter_vector = [ s,t,v,w,q,e,r,m,b,a ] parameter_values_vector =[ 2,3,6,1,0,9,5,5,3,2] out = np.zeros(10) for j in range(10): f_vector_j = f_vector[j] out[j] = float(f_vector_j.subs(parameter_vector, parameter_values_vector)) print(out)
方案2:高性能批量赋值(推荐1000参数场景使用)
使用SymPy的lambdify方法直接将符号函数转换为数值函数,无需循环,运行效率提升数十倍:
import sympy as sym import numpy as np s,t,v,w,q,e,r,m,b,a = sym.symbols ('s,t,v,w,q,e,r,m,b,a') f_vector = [ s+t, s, v-2, w-a, q, r, e, a-7, b-m, t ] parameter_vector = [ s,t,v,w,q,e,r,m,b,a ] parameter_values_vector =[ 2,3,6,1,0,9,5,5,3,2] # 转换为numpy兼容的数值函数 f_numeric = sym.lambdify(parameter_vector, f_vector, modules="numpy") # 一次性传入所有参数,直接得到全部分量的计算结果 out = np.array(f_numeric(*parameter_values_vector)) print(out)
两种方案输出结果均为[ 5. 2. 4. -1. 0. 5. 9. -5. -2. 3.]。
内容的提问来源于stack exchange,提问作者Nirbhikk
相关产品推荐
相关产品推荐

