有时,当代数特别糟糕时,我会使用Mathematica推导出一个公式,然后使用CForm[]将结果表达式转换为可编译的C代码。通常,我也希望在Python中使用这个公式。有没有现成的工具可以做到这一点?举个例子,这是一个最近的公式,正如你所看到的,手动转换不是一件令人愉快的事情:
(Power(a,5)*M + 2*Power(a,3)*M*r*(-2*M + r) + a*M*Power(r,2)*Power(-2*M + r,2) -
Sqrt(-(Power(r,3)*Power(Power(a,2) + r*(-2*M + r),2)*(Power(a,4)*M*(-1 + Power(rd,2)) -
Power(a,2)*r*(2*M*r + Power(r,2)*Power(rd,2) + Power(M,2)*(-4 + Power(rd,2))) +
M*Power(r,2)*(-4*Power(M,2) + 4*M*r + Power(r,2)*(-1 + Power(rd,2)))))))/((Power(a,2)*M - Power(r,3))*Power(Power(a,2) + r*(-2*M + r),2))发布于 2016-03-02 17:00:03
你不需要转换任何东西。Python和C中的代数运算符具有相同的优先顺序:*、/、+、-,它们都是从左到右的。有关示例https://montcs.bloomu.edu/Information/operator-precedence.C-Python-Pascal.shtml,请参阅。
您只需定义所使用的函数。在您的示例中,我看到了Power()和Sqrt(),它们可能会映射到Python的math.pow()和math.sqrt()。
发布于 2016-03-02 16:50:51
您可以使用Sympy在python中派生公式,然后在python中执行。
这是通常的方式
发布于 2016-03-02 17:01:30
假设您信任这些代码,您可以使用exec
from math import sqrt
formula_str = """
def myfunc(a,r,rd,M):
return (Power(a,5)*M + 2*Power(a,3)*M*r*(-2*M + r) + a*M*Power(r,2)*Power(-2*M + r,2) -
Sqrt(-(Power(r,3)*Power(Power(a,2) + r*(-2*M + r),2)*(Power(a,4)*M*(-1 + Power(rd,2)) -
Power(a,2)*r*(2*M*r + Power(r,2)*Power(rd,2) + Power(M,2)*(-4 + Power(rd,2))) +
M*Power(r,2)*(-4*Power(M,2) + 4*M*r + Power(r,2)*(-1 + Power(rd,2)))))))/((Power(a,2)*M - Power(r,3))*Power(Power(a,2) + r*(-2*M + r),2))
""".replace("Power","pow").replace("Sqrt","sqrt")
myfunc(5,4,3,2) #output:0.6288528754088698https://stackoverflow.com/questions/35742289
复制相似问题