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

やりたいと思っていても、本当はやりたくないのかもしれません。Python 初心者は通常、浮動小数点数を評価すると予期しない結果 (1.0/10 = 0.100000000000001 など) が得られるため、浮動小数点数を丸める必要があると考えています。式で間抜けな文字列置換を行うのではなく、 の変数を作成し、round(49/200,n)フォーマットのクリーンアップを少し行いました。またexp(49/200)、13 回評価する必要はなく、1 回だけ実行して計算値を参照します。

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

これがあなたに必要なものかどうか疑問に思います:

元の方程式が文字列変数にある場合は、文字列の置換メソッドをeq使用して新しい方程式を作成できます。

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

同様の式roundnで関数を回避できexp()ます(ここでは、気の利いた正規表現が必要になる可能性があります)。

于 2010-11-23T14:59:49.233 に答える
0

p=re.compile(r'\d+/\d+')roundn 関数の出力を使用して、たとえば、すべての一致をサブできます。参考までに、式で非常に多くの用語を概算すると、丸める桁数によっては、必ずしも実際の結果に非常に近いとは限らない結果が得られます。

于 2010-11-23T09:57:27.140 に答える