3

想象像字符串操作

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

我想传递的功能“roundn”的说法无论操作是不是addtion或减法 所以我的表情变得

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 
+5

有什么问题吗? – Ber 2010-11-23 09:29:37

+0

拆分最后一行代码。 – 2010-11-23 09:46:23

+0

我想你的意思是函数`round()`在文档[here]中描述(http://docs.python.org/library/functions.html?highlight=round#round)。 – martineau 2010-11-23 11:38:28

回答

0

你可以用你的roundn函数的输出结果来分配每个匹配,p=re.compile(r'\d+/\d+')。仅供参考,近似表达式中的许多术语将产生一个结果,但不一定非常接近实际结果,具体取决于您舍入的数字。

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,幂运算符是**,不^

编辑: 如果美国洛特没有建议的代数简化,我会离开这个原样。但* 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

我不知道这是否是你所需要的:

如果原方程是字符串变量eq在您可以创建使用字符串的方法replace你的新公式:

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

和类似表述可以把周围的exp()功能roundn(POS这里需要一些漂亮的正则表达式)。