3

想象一下

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

4 回答 4

6

也许你认为你想这样做,但你并不是真的想这样做。新的 Pythoners 通常认为他们需要对浮点数进行四舍五入,因为在评估时会得到意想不到的结果(如 1.0/10 = 0.100000000000001)。我没有对您的表达式进行一些愚蠢的字符串替换,而是创建了一个变量 for 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)
于 2010-11-23T10:21:12.857 回答
2

用这个

http://sympy.org/

于 2010-11-30T00:39:48.647 回答
1

I wonder whether this is what you need:

If you original equation is in the string variable eq you can create your new equations using the replace method of strings:

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

and a similar expression could put roundn around the exp() function (possibly need some nifty regex here).

于 2010-11-23T14:59:49.233 回答
0

p=re.compile(r'\d+/\d+')你可以用你的 roundn 函数的输出来划分每场比赛。仅供参考,在您的表达式中近似这么多术语将产生不一定非常接近实际结果的结果,具体取决于您四舍五入的位数。

于 2010-11-23T09:57:27.140 回答