数学表达式中String类型的字符串操作

时间:2010-11-23 09:20:17

标签: python string substitution formal-languages formal-semantics

想象一下像

exp(49/200)+(x-49/200)

我想传递函数“roundn”的参数,无论是不是加法或减法的操作 所以我的表情变成了

roundn(exp(roundn(49/200, n)), n) + (x - roundn(49/200, n)

我想要操纵的表达是:

exp(49/200)+exp(49/200)*(x-49/200)+1/2*exp(49/200)*(x-49/200)^2+1/6*exp(49/200)*(x-49/200)^3+1/24*exp(49/200)*(x-49/200)^4+1/120*exp(49/200)*(x-49/200)^5+1/720*exp(49/200)*(x-49/200)^6+1/5040*exp(49/200)*(x-49/200)^7+1/40320*exp(49/200)*(x-49/200)^8+1/362880*exp(49/200)*(x-49/200)^9+1/3628800*exp(49/200)*(x-49/200)^10+1/39916800*exp(49/200)*(x-49/200)^11

4 个答案:

答案 0 :(得分:6)

也许你认为你想要这样做,但你真的不想这样做。新的Pythoners通常认为他们需要舍入浮点数,因为在评估时他们会得到意想不到的结果(如1.0 / 10 = 0.100000000000001)。我没有为你的表达式做一些愚蠢的字符串替换,而是为round(49/200,n)创建了一个变量,并进行了一些格式清理。此外exp(49/200)不需要评估13次,只需执行一次并参考计算值。

zz = round(49/200,n)
e_zz = exp(zz)
ans = (e_zz + 
    e_zz * (x-zz) +
    1/2 * e_zz * (x-zz)**2 +
    1/6 * e_zz * (x-zz)**3 +
    1/24 * e_zz * (x-zz)**4 +
    1/120 * e_zz * (x-zz)**5 +
    1/720 * e_zz * (x-zz)**6 +
    1/5040 * e_zz * (x-zz)**7 +
    1/40320 * e_zz * (x-zz)**8 +
    1/362880 * e_zz * (x-zz)**9 +
    1/3628800 * e_zz * (x-zz)**10 +
    1/39916800 * e_zz * (x-zz)**11)

将e提升到四舍五入的数字几乎不合适。同样地,将四舍五入的数字提高到11'次幂。 (另请注意,在Python中,取幂运算符为**,而不是^。)

<强>被修改: 如果S.Lott没有建议代数简化,我会原样保留原样。但* e_zz可以在每个术语中考虑因素,使得更简单(并且可能更快):

zz = round(49/200,n)
e_zz = exp(zz)
ans = e_zz * (1 + 
    (x-zz) +
    1/2 * (x-zz)**2 +
    1/6 * (x-zz)**3 +
    1/24 * (x-zz)**4 +
    1/120 * (x-zz)**5 +
    1/720 * (x-zz)**6 +
    1/5040 * (x-zz)**7 +
    1/40320 * (x-zz)**8 +
    1/362880 * (x-zz)**9 +
    1/3628800 * (x-zz)**10 +
    1/39916800 * (x-zz)**11)

答案 1 :(得分:2)

使用此

http://sympy.org/

答案 2 :(得分:1)

我想知道这是否是你需要的:

如果原始方程在字符串变量eq中,您可以使用replace字符串方法创建新方程式:

eq.replace('49/200', 'roundn(49/200,n)')

和类似的表达式可能会在roundn函数周围放置exp()(这里可能需要一些漂亮的正则表达式)。

答案 3 :(得分:0)

您可以使用roundn函数的输出将所有匹配的p=re.compile(r'\d+/\d+')。仅供参考,在表达式中近似这么多项将产生一个不一定非常接近实际结果的结果,具体取决于您舍入的位数。