Symbolic Integration for hard expressions and generate function

Hello All,

I am trying to generate Julia functions by deriving the symbolic expressions in Julia. I started using Symbolics.jl and SymbolicNumericIntegration.jl, however it seems that SymbolicNumericIntegration.jl is not that accurate.Based on the documentation, if the second and third argument are non-zero it means that the algorithm wasn’t able to calculate the integral.

``integratereturns a tuple with three values. The first one is the solved integral, the second one is the sum of the unsolved terms, and the third value is the residual error. Ifintegrate is successful, the unsolved portion is reported as 0.

I will attach some part of my code here. I should mention that p1_1 is generated with Julia, I didn’t put the derivation and rest of the code since it is quite lengthy.

using Symbolics
using SymbolicNumericIntegration

@variables q[1:3] xi r L0
p1_1 = (-6L0*(q[1]^9)*(xi^10) + 27L0*(q[1]^8)*q[2]*(xi^10) + 27L0*(q[1]^8)*q[3]*(xi^10) - 72L0*(q[1]^7)*(q[2]^2)*(xi^10) - 72L0*(q[1]^7)*q[2]*q[3]*(xi^10) - 72L0*(q[1]^7)*(q[3]^2)*(xi^10) + 126L0*(q[1]^6)*(q[2]^3)*(xi^10) + 126L0*(q[1]^6)*(q[2]^2)*q[3]*(xi^10) + 126L0*(q[1]^6)*q[2]*(q[3]^2)*(xi^10) + 126L0*(q[1]^6)*(q[3]^3)*(xi^10) - 162L0*(q[1]^5)*(q[2]^4)*(xi^10) - 108L0*(q[1]^5)*(q[2]^3)*q[3]*(xi^10) - 216L0*(q[1]^5)*(q[2]^2)*(q[3]^2)*(xi^10) - 108L0*(q[1]^5)*q[2]*(q[3]^3)*(xi^10) - 162L0*(q[1]^5)*(q[3]^4)*(xi^10) + 153L0*(q[1]^4)*(q[2]^5)*(xi^10) + 45L0*(q[1]^4)*(q[2]^4)*q[3]*(xi^10) + 180L0*(q[1]^4)*(q[2]^3)*(q[3]^2)*(xi^10) + 180L0*(q[1]^4)*(q[2]^2)*(q[3]^3)*(xi^10) + 45L0*(q[1]^4)*q[2]*(q[3]^4)*(xi^10) + 153L0*(q[1]^4)*(q[3]^5)*(xi^10) - 108L0*(q[1]^3)*(q[2]^6)*(xi^10) + 36L0*(q[1]^3)*(q[2]^5)*q[3]*(xi^10) - 180L0*(q[1]^3)*(q[2]^4)*(q[3]^2)*(xi^10) - 180L0*(q[1]^3)*(q[2]^2)*(q[3]^4)*(xi^10) + 36L0*(q[1]^3)*q[2]*(q[3]^5)*(xi^10) - 108L0*(q[1]^3)*(q[3]^6)*(xi^10) + 54L0*(q[1]^2)*(q[2]^7)*(xi^10) - 54L0*(q[1]^2)*(q[2]^6)*q[3]*(xi^10) + 108L0*(q[1]^2)*(q[2]^5)*(q[3]^2)*(xi^10) + 108L0*(q[1]^2)*(q[2]^2)*(q[3]^5)*(xi^10) - 54L0*(q[1]^2)*q[2]*(q[3]^6)*(xi^10) + 54L0*(q[1]^2)*(q[3]^7)*(xi^10) - 18L0*q[1]*(q[2]^8)*(xi^10) + 36L0*q[1]*(q[2]^7)*q[3]*(xi^10) - 72L0*q[1]*(q[2]^6)*(q[3]^2)*(xi^10) + 72L0*q[1]*(q[2]^5)*(q[3]^3)*(xi^10) - 90L0*q[1]*(q[2]^4)*(q[3]^4)*(xi^10) + 72L0*q[1]*(q[2]^3)*(q[3]^5)*(xi^10) - 72L0*q[1]*(q[2]^2)*(q[3]^6)*(xi^10) + 36L0*q[1]*q[2]*(q[3]^7)*(xi^10) - 18L0*q[1]*(q[3]^8)*(xi^10) + 3L0*(q[2]^9)*(xi^10) - 9L0*(q[2]^8)*q[3]*(xi^10) + 18L0*(q[2]^7)*(q[3]^2)*(xi^10) - 18L0*(q[2]^6)*(q[3]^3)*(xi^10) + 9L0*(q[2]^5)*(q[3]^4)*(xi^10) + 9L0*(q[2]^4)*(q[3]^5)*(xi^10) - 18L0*(q[2]^3)*(q[3]^6)*(xi^10) + 18L0*(q[2]^2)*(q[3]^7)*(xi^10) - 9L0*q[2]*(q[3]^8)*(xi^10) + 3L0*(q[3]^9)*(xi^10) - 2(q[1]^10)*(xi^10) + 7(q[1]^9)*q[2]*(xi^10) + 7(q[1]^9)*q[3]*(xi^10) - 15(q[1]^8)*(q[2]^2)*(xi^10) - 6(q[1]^8)*q[2]*q[3]*(xi^10) - 15(q[1]^8)*(q[3]^2)*(xi^10) + 18(q[1]^7)*(q[2]^3)*(xi^10) - 6(q[1]^7)*(q[2]^2)*q[3]*(xi^10) - 6(q[1]^7)*q[2]*(q[3]^2)*(xi^10) + 18(q[1]^7)*(q[3]^3)*(xi^10) - 12(q[1]^6)*(q[2]^4)*(xi^10) + 48(q[1]^6)*(q[2]^3)*q[3]*(xi^10) + 12(q[1]^6)*(q[2]^2)*(q[3]^2)*(xi^10) + 48(q[1]^6)*q[2]*(q[3]^3)*(xi^10) - 12(q[1]^6)*(q[3]^4)*(xi^10) - 3(q[1]^5)*(q[2]^5)*(xi^10) - 75(q[1]^5)*(q[2]^4)*q[3]*(xi^10) - 48(q[1]^5)*(q[2]^3)*(q[3]^2)*(xi^10) - 48(q[1]^5)*(q[2]^2)*(q[3]^3)*(xi^10) - 75(q[1]^5)*q[2]*(q[3]^4)*(xi^10) - 3(q[1]^5)*(q[3]^5)*(xi^10) + 15(q[1]^4)*(q[2]^6)*(xi^10) + 78(q[1]^4)*(q[2]^5)*q[3]*(xi^10) + 15(q[1]^4)*(q[2]^4)*(q[3]^2)*(xi^10) + 120(q[1]^4)*(q[2]^3)*(q[3]^3)*(xi^10) + 15(q[1]^4)*(q[2]^2)*(q[3]^4)*(xi^10) + 78(q[1]^4)*q[2]*(q[3]^5)*(xi^10) + 15(q[1]^4)*(q[3]^6)*(xi^10) - 18(q[1]^3)*(q[2]^7)*(xi^10) - 42(q[1]^3)*(q[2]^6)*q[3]*(xi^10) - 12(q[1]^3)*(q[2]^5)*(q[3]^2)*(xi^10) - 60(q[1]^3)*(q[2]^4)*(q[3]^3)*(xi^10) - 60(q[1]^3)*(q[2]^3)*(q[3]^4)*(xi^10) - 12(q[1]^3)*(q[2]^2)*(q[3]^5)*(xi^10) - 42(q[1]^3)*q[2]*(q[3]^6)*(xi^10) - 18(q[1]^3)*(q[3]^7)*(xi^10) + 12(q[1]^2)*(q[2]^8)*(xi^10) + 12(q[1]^2)*(q[2]^7)*q[3]*(xi^10) - 6(q[1]^2)*(q[2]^6)*(q[3]^2)*(xi^10) + 60(q[1]^2)*(q[2]^5)*(q[3]^3)*(xi^10) - 30(q[1]^2)*(q[2]^4)*(q[3]^4)*(xi^10) + 60(q[1]^2)*(q[2]^3)*(q[3]^5)*(xi^10) - 6(q[1]^2)*(q[2]^2)*(q[3]^6)*(xi^10) + 12(q[1]^2)*q[2]*(q[3]^7)*(xi^10) + 12(q[1]^2)*(q[3]^8)*(xi^10) - 5q[1]*(q[2]^9)*(xi^10) + 3q[1]*(q[2]^8)*q[3]*(xi^10) - 6q[1]*(q[2]^7)*(q[3]^2)*(xi^10) - 6q[1]*(q[2]^6)*(q[3]^3)*(xi^10) - 3q[1]*(q[2]^5)*(q[3]^4)*(xi^10) - 3q[1]*(q[2]^4)*(q[3]^5)*(xi^10) - 6q[1]*(q[2]^3)*(q[3]^6)*(xi^10) - 6q[1]*(q[2]^2)*(q[3]^7)*(xi^10) + 3q[1]*q[2]*(q[3]^8)*(xi^10) - 5q[1]*(q[3]^9)*(xi^10) + (q[2]^10)*(xi^10) - 2(q[2]^9)*q[3]*(xi^10) + 3(q[2]^8)*(q[3]^2)*(xi^10) - 3(q[2]^6)*(q[3]^4)*(xi^10) + 6(q[2]^5)*(q[3]^5)*(xi^10) - 3(q[2]^4)*(q[3]^6)*(xi^10) + 3(q[2]^2)*(q[3]^8)*(xi^10) - 2q[2]*(q[3]^9)*(xi^10) + (q[3]^10)*(xi^10)) / (837019575(r^9)) + (-6L0*(q[1]^5)*(xi^6) + 15L0*(q[1]^4)*q[2]*(xi^6) + 15L0*(q[1]^4)*q[3]*(xi^6) - 24L0*(q[1]^3)*(q[2]^2)*(xi^6) - 12L0*(q[1]^3)*q[2]*q[3]*(xi^6) - 24L0*(q[1]^3)*(q[3]^2)*(xi^6) + 21L0*(q[1]^2)*(q[2]^3)*(xi^6) + 9L0*(q[1]^2)*(q[2]^2)*q[3]*(xi^6) + 9L0*(q[1]^2)*q[2]*(q[3]^2)*(xi^6) + 21L0*(q[1]^2)*(q[3]^3)*(xi^6) - 12L0*q[1]*(q[2]^4)*(xi^6) + 6L0*q[1]*(q[2]^3)*q[3]*(xi^6) - 18L0*q[1]*(q[2]^2)*(q[3]^2)*(xi^6) + 6L0*q[1]*q[2]*(q[3]^3)*(xi^6) - 12L0*q[1]*(q[3]^4)*(xi^6) + 3L0*(q[2]^5)*(xi^6) - 3L0*(q[2]^4)*q[3]*(xi^6) + 3L0*(q[2]^3)*(q[3]^2)*(xi^6) + 3L0*(q[2]^2)*(q[3]^3)*(xi^6) - 3L0*q[2]*(q[3]^4)*(xi^6) + 3L0*(q[3]^5)*(xi^6) - 2(q[1]^6)*(xi^6) + 3(q[1]^5)*q[2]*(xi^6) + 3(q[1]^5)*q[3]*(xi^6) - 3(q[1]^4)*(q[2]^2)*(xi^6) + 6(q[1]^4)*q[2]*q[3]*(xi^6) - 3(q[1]^4)*(q[3]^2)*(xi^6) - (q[1]^3)*(q[2]^3)*(xi^6) - 9(q[1]^3)*(q[2]^2)*q[3]*(xi^6) - 9(q[1]^3)*q[2]*(q[3]^2)*(xi^6) - (q[1]^3)*(q[3]^3)*(xi^6) + 3(q[1]^2)*(q[2]^4)*(xi^6) + 12(q[1]^2)*(q[2]^3)*q[3]*(xi^6) + 12(q[1]^2)*q[2]*(q[3]^3)*(xi^6) + 3(q[1]^2)*(q[3]^4)*(xi^6) - 3q[1]*(q[2]^5)*(xi^6) - 3q[1]*(q[2]^4)*q[3]*(xi^6) - 3q[1]*(q[2]^3)*(q[3]^2)*(xi^6) - 3q[1]*(q[2]^2)*(q[3]^3)*(xi^6) - 3q[1]*q[2]*(q[3]^4)*(xi^6) - 3q[1]*(q[3]^5)*(xi^6) + (q[2]^6)*(xi^6) + 2(q[2]^3)*(q[3]^3)*(xi^6) + (q[3]^6)*(xi^6)) / (32805(r^5)) + (-6L0*q[1]*(xi^2) + 3L0*q[2]*(xi^2) + 3L0*q[3]*(xi^2) - 2(q[1]^2)*(xi^2) - q[1]*q[2]*(xi^2) - q[1]*q[3]*(xi^2) + (q[2]^2)*(xi^2) + 2q[2]*q[3]*(xi^2) + (q[3]^2)*(xi^2)) / (18r) + (6L0*(q[1]^3)*(xi^4) - 9L0*(q[1]^2)*q[2]*(xi^4) - 9L0*(q[1]^2)*q[3]*(xi^4) + 9L0*q[1]*(q[2]^2)*(xi^4) + 9L0*q[1]*(q[3]^2)*(xi^4) - 3L0*(q[2]^3)*(xi^4) - 3L0*(q[3]^3)*(xi^4) + 2(q[1]^4)*(xi^4) - (q[1]^3)*q[2]*(xi^4) - (q[1]^3)*q[3]*(xi^4) - 6(q[1]^2)*q[2]*q[3]*(xi^4) + 2q[1]*(q[2]^3)*(xi^4) + 3q[1]*(q[2]^2)*q[3]*(xi^4) + 3q[1]*q[2]*(q[3]^2)*(xi^4) + 2q[1]*(q[3]^3)*(xi^4) - (q[2]^4)*(xi^4) - (q[2]^3)*q[3]*(xi^4) - q[2]*(q[3]^3)*(xi^4) - (q[3]^4)*(xi^4)) / (486(r^3)) + (6L0*(q[1]^7)*(xi^8) - 21L0*(q[1]^6)*q[2]*(xi^8) - 21L0*(q[1]^6)*q[3]*(xi^8) + 45L0*(q[1]^5)*(q[2]^2)*(xi^8) + 36L0*(q[1]^5)*q[2]*q[3]*(xi^8) + 45L0*(q[1]^5)*(q[3]^2)*(xi^8) - 60L0*(q[1]^4)*(q[2]^3)*(xi^8) - 45L0*(q[1]^4)*(q[2]^2)*q[3]*(xi^8) - 45L0*(q[1]^4)*q[2]*(q[3]^2)*(xi^8) - 60L0*(q[1]^4)*(q[3]^3)*(xi^8) + 57L0*(q[1]^3)*(q[2]^4)*(xi^8) + 12L0*(q[1]^3)*(q[2]^3)*q[3]*(xi^8) + 72L0*(q[1]^3)*(q[2]^2)*(q[3]^2)*(xi^8) + 12L0*(q[1]^3)*q[2]*(q[3]^3)*(xi^8) + 57L0*(q[1]^3)*(q[3]^4)*(xi^8) - 36L0*(q[1]^2)*(q[2]^5)*(xi^8) + 9L0*(q[1]^2)*(q[2]^4)*q[3]*(xi^8) - 36L0*(q[1]^2)*(q[2]^3)*(q[3]^2)*(xi^8) - 36L0*(q[1]^2)*(q[2]^2)*(q[3]^3)*(xi^8) + 9L0*(q[1]^2)*q[2]*(q[3]^4)*(xi^8) - 36L0*(q[1]^2)*(q[3]^5)*(xi^8) + 15L0*q[1]*(q[2]^6)*(xi^8) - 18L0*q[1]*(q[2]^5)*q[3]*(xi^8) + 36L0*q[1]*(q[2]^4)*(q[3]^2)*(xi^8) - 24L0*q[1]*(q[2]^3)*(q[3]^3)*(xi^8) + 36L0*q[1]*(q[2]^2)*(q[3]^4)*(xi^8) - 18L0*q[1]*q[2]*(q[3]^5)*(xi^8) + 15L0*q[1]*(q[3]^6)*(xi^8) - 3L0*(q[2]^7)*(xi^8) + 6L0*(q[2]^6)*q[3]*(xi^8) - 9L0*(q[2]^5)*(q[3]^2)*(xi^8) + 3L0*(q[2]^4)*(q[3]^3)*(xi^8) + 3L0*(q[2]^3)*(q[3]^4)*(xi^8) - 9L0*(q[2]^2)*(q[3]^5)*(xi^8) + 6L0*q[2]*(q[3]^6)*(xi^8) - 3L0*(q[3]^7)*(xi^8) + 2(q[1]^8)*(xi^8) - 5(q[1]^7)*q[2]*(xi^8) - 5(q[1]^7)*q[3]*(xi^8) + 8(q[1]^6)*(q[2]^2)*(xi^8) - 2(q[1]^6)*q[2]*q[3]*(xi^8) + 8(q[1]^6)*(q[3]^2)*(xi^8) - 5(q[1]^5)*(q[2]^3)*(xi^8) + 12(q[1]^5)*(q[2]^2)*q[3]*(xi^8) + 12(q[1]^5)*q[2]*(q[3]^2)*(xi^8) - 5(q[1]^5)*(q[3]^3)*(xi^8) - (q[1]^4)*(q[2]^4)*(xi^8) - 31(q[1]^4)*(q[2]^3)*q[3]*(xi^8) - 6(q[1]^4)*(q[2]^2)*(q[3]^2)*(xi^8) - 31(q[1]^4)*q[2]*(q[3]^3)*(xi^8) - (q[1]^4)*(q[3]^4)*(xi^8) + 7(q[1]^3)*(q[2]^5)*(xi^8) + 26(q[1]^3)*(q[2]^4)*q[3]*(xi^8) + 16(q[1]^3)*(q[2]^3)*(q[3]^2)*(xi^8) + 16(q[1]^3)*(q[2]^2)*(q[3]^3)*(xi^8) + 26(q[1]^3)*q[2]*(q[3]^4)*(xi^8) + 7(q[1]^3)*(q[3]^5)*(xi^8) - 7(q[1]^2)*(q[2]^6)*(xi^8) - 15(q[1]^2)*(q[2]^5)*q[3]*(xi^8) + 3(q[1]^2)*(q[2]^4)*(q[3]^2)*(xi^8) - 32(q[1]^2)*(q[2]^3)*(q[3]^3)*(xi^8) + 3(q[1]^2)*(q[2]^2)*(q[3]^4)*(xi^8) - 15(q[1]^2)*q[2]*(q[3]^5)*(xi^8) - 7(q[1]^2)*(q[3]^6)*(xi^8) + 4q[1]*(q[2]^7)*(xi^8) + q[1]*(q[2]^6)*q[3]*(xi^8) + 3q[1]*(q[2]^5)*(q[3]^2)*(xi^8) + 5q[1]*(q[2]^4)*(q[3]^3)*(xi^8) + 5q[1]*(q[2]^3)*(q[3]^4)*(xi^8) + 3q[1]*(q[2]^2)*(q[3]^5)*(xi^8) + q[1]*q[2]*(q[3]^6)*(xi^8) + 4q[1]*(q[3]^7)*(xi^8) - (q[2]^8)*(xi^8) + (q[2]^7)*q[3]*(xi^8) - (q[2]^6)*(q[3]^2)*(xi^8) - 2(q[2]^5)*(q[3]^3)*(xi^8) + 2(q[2]^4)*(q[3]^4)*(xi^8) - 2(q[2]^3)*(q[3]^5)*(xi^8) - (q[2]^2)*(q[3]^6)*(xi^8) + q[2]*(q[3]^7)*(xi^8) - (q[3]^8)*(xi^8)) / (4133430(r^7))

p1_1_int = SymbolicNumericIntegration.integrate(p1_1, xi; detailed=true)

println("p1_1_int[3]: ", p1_1_int[3])

The errors and output:

[ Info: The input expression has constant parameters: [L0, q[1], q[2], q[3], r], forcing `symbolic = true`
[ Info: The input expression has constant parameters: [L0, q[1], q[2], q[3], r], forcing `symbolic = true`
[ Info: Symbolic integration failed. Try changing constant parameters ([L0, q[1], q[2], q[3], r]) to numerical values.
[ Info: The input expression has constant parameters: [L0, q[1], q[2], q[3], r], forcing `symbolic = true`
[ Info: Symbolic integration failed. Try changing constant parameters ([L0, q[1], q[2], q[3], r]) to numerical values.
[ Info: The input expression has constant parameters: [L0, q[1], q[2], q[3], r], forcing `symbolic = true`
[ Info: Symbolic integration failed. Try changing constant parameters ([L0, q[1], q[2], q[3], r]) to numerical values.
p1_1_int[3]: Inf

I couldn’t make this pipeline work. So, my first question is: Can we better use SymbolicNumericaIntegration to solve this?

I did some some research and find out that SymPy is quite good in symbolic integration. It is important that I generate a function with Julia (build_function symbolic) since I want my code to be fast. I have this idea as an alternative approach. I will first integrate the expression using Sympy and then change it to Julia expression so that I can generate a fast function using build_function from Symbolics. I am able to generate string expression compatible with Julia, but I am lost afterwards how can I define variables using symbolic and pass this string to build_function with Symbolics package. Is there a better way to do this?

using PyCall        # for calling Python
using Symbolics     # for symbolic manipulations in Julia

sympy = pyimport("sympy")


q1 = sympy.Symbol("q1", real=true)
q2 = sympy.Symbol("q2", real=true)
q3= sympy.Symbol("q3", real=true)
xi = sympy.Symbol("xi", real=true)
r  = sympy.Symbol("r",  positive=true, real=true)
L0 = sympy.Symbol("L0", positive=true, real=true)


p1_1 = (-6L0*(q1^9)*(xi^10) + 27L0*(q1^8)*q2*(xi^10) + 27L0*(q1^8)*q3*(xi^10) - 72L0*(q1^7)*(q2^2)*(xi^10) - 72L0*(q1^7)*q2*q3*(xi^10) - 72L0*(q1^7)*(q3^2)*(xi^10) + 126L0*(q1^6)*(q2^3)*(xi^10) + 126L0*(q1^6)*(q2^2)*q3*(xi^10) + 126L0*(q1^6)*q2*(q3^2)*(xi^10) + 126L0*(q1^6)*(q3^3)*(xi^10) - 162L0*(q1^5)*(q2^4)*(xi^10) - 108L0*(q1^5)*(q2^3)*q3*(xi^10) - 216L0*(q1^5)*(q2^2)*(q3^2)*(xi^10) - 108L0*(q1^5)*q2*(q3^3)*(xi^10) - 162L0*(q1^5)*(q3^4)*(xi^10) + 153L0*(q1^4)*(q2^5)*(xi^10) + 45L0*(q1^4)*(q2^4)*q3*(xi^10) + 180L0*(q1^4)*(q2^3)*(q3^2)*(xi^10) + 180L0*(q1^4)*(q2^2)*(q3^3)*(xi^10) + 45L0*(q1^4)*q2*(q3^4)*(xi^10) + 153L0*(q1^4)*(q3^5)*(xi^10) - 108L0*(q1^3)*(q2^6)*(xi^10) + 36L0*(q1^3)*(q2^5)*q3*(xi^10) - 180L0*(q1^3)*(q2^4)*(q3^2)*(xi^10) - 180L0*(q1^3)*(q2^2)*(q3^4)*(xi^10) + 36L0*(q1^3)*q2*(q3^5)*(xi^10) - 108L0*(q1^3)*(q3^6)*(xi^10) + 54L0*(q1^2)*(q2^7)*(xi^10) - 54L0*(q1^2)*(q2^6)*q3*(xi^10) + 108L0*(q1^2)*(q2^5)*(q3^2)*(xi^10) + 108L0*(q1^2)*(q2^2)*(q3^5)*(xi^10) - 54L0*(q1^2)*q2*(q3^6)*(xi^10) + 54L0*(q1^2)*(q3^7)*(xi^10) - 18L0*q1*(q2^8)*(xi^10) + 36L0*q1*(q2^7)*q3*(xi^10) - 72L0*q1*(q2^6)*(q3^2)*(xi^10) + 72L0*q1*(q2^5)*(q3^3)*(xi^10) - 90L0*q1*(q2^4)*(q3^4)*(xi^10) + 72L0*q1*(q2^3)*(q3^5)*(xi^10) - 72L0*q1*(q2^2)*(q3^6)*(xi^10) + 36L0*q1*q2*(q3^7)*(xi^10) - 18L0*q1*(q3^8)*(xi^10) + 3L0*(q2^9)*(xi^10) - 9L0*(q2^8)*q3*(xi^10) + 18L0*(q2^7)*(q3^2)*(xi^10) - 18L0*(q2^6)*(q3^3)*(xi^10) + 9L0*(q2^5)*(q3^4)*(xi^10) + 9L0*(q2^4)*(q3^5)*(xi^10) - 18L0*(q2^3)*(q3^6)*(xi^10) + 18L0*(q2^2)*(q3^7)*(xi^10) - 9L0*q2*(q3^8)*(xi^10) + 3L0*(q3^9)*(xi^10) - 2(q1^10)*(xi^10) + 7(q1^9)*q2*(xi^10) + 7(q1^9)*q3*(xi^10) - 15(q1^8)*(q2^2)*(xi^10) - 6(q1^8)*q2*q3*(xi^10) - 15(q1^8)*(q3^2)*(xi^10) + 18(q1^7)*(q2^3)*(xi^10) - 6(q1^7)*(q2^2)*q3*(xi^10) - 6(q1^7)*q2*(q3^2)*(xi^10) + 18(q1^7)*(q3^3)*(xi^10) - 12(q1^6)*(q2^4)*(xi^10) + 48(q1^6)*(q2^3)*q3*(xi^10) + 12(q1^6)*(q2^2)*(q3^2)*(xi^10) + 48(q1^6)*q2*(q3^3)*(xi^10) - 12(q1^6)*(q3^4)*(xi^10) - 3(q1^5)*(q2^5)*(xi^10) - 75(q1^5)*(q2^4)*q3*(xi^10) - 48(q1^5)*(q2^3)*(q3^2)*(xi^10) - 48(q1^5)*(q2^2)*(q3^3)*(xi^10) - 75(q1^5)*q2*(q3^4)*(xi^10) - 3(q1^5)*(q3^5)*(xi^10) + 15(q1^4)*(q2^6)*(xi^10) + 78(q1^4)*(q2^5)*q3*(xi^10) + 15(q1^4)*(q2^4)*(q3^2)*(xi^10) + 120(q1^4)*(q2^3)*(q3^3)*(xi^10) + 15(q1^4)*(q2^2)*(q3^4)*(xi^10) + 78(q1^4)*q2*(q3^5)*(xi^10) + 15(q1^4)*(q3^6)*(xi^10) - 18(q1^3)*(q2^7)*(xi^10) - 42(q1^3)*(q2^6)*q3*(xi^10) - 12(q1^3)*(q2^5)*(q3^2)*(xi^10) - 60(q1^3)*(q2^4)*(q3^3)*(xi^10) - 60(q1^3)*(q2^3)*(q3^4)*(xi^10) - 12(q1^3)*(q2^2)*(q3^5)*(xi^10) - 42(q1^3)*q2*(q3^6)*(xi^10) - 18(q1^3)*(q3^7)*(xi^10) + 12(q1^2)*(q2^8)*(xi^10) + 12(q1^2)*(q2^7)*q3*(xi^10) - 6(q1^2)*(q2^6)*(q3^2)*(xi^10) + 60(q1^2)*(q2^5)*(q3^3)*(xi^10) - 30(q1^2)*(q2^4)*(q3^4)*(xi^10) + 60(q1^2)*(q2^3)*(q3^5)*(xi^10) - 6(q1^2)*(q2^2)*(q3^6)*(xi^10) + 12(q1^2)*q2*(q3^7)*(xi^10) + 12(q1^2)*(q3^8)*(xi^10) - 5q1*(q2^9)*(xi^10) + 3q1*(q2^8)*q3*(xi^10) - 6q1*(q2^7)*(q3^2)*(xi^10) - 6q1*(q2^6)*(q3^3)*(xi^10) - 3q1*(q2^5)*(q3^4)*(xi^10) - 3q1*(q2^4)*(q3^5)*(xi^10) - 6q1*(q2^3)*(q3^6)*(xi^10) - 6q1*(q2^2)*(q3^7)*(xi^10) + 3q1*q2*(q3^8)*(xi^10) - 5q1*(q3^9)*(xi^10) + (q2^10)*(xi^10) - 2(q2^9)*q3*(xi^10) + 3(q2^8)*(q3^2)*(xi^10) - 3(q2^6)*(q3^4)*(xi^10) + 6(q2^5)*(q3^5)*(xi^10) - 3(q2^4)*(q3^6)*(xi^10) + 3(q2^2)*(q3^8)*(xi^10) - 2q2*(q3^9)*(xi^10) + (q3^10)*(xi^10)) / (837019575(r^9)) + (-6L0*(q1^5)*(xi^6) + 15L0*(q1^4)*q2*(xi^6) + 15L0*(q1^4)*q3*(xi^6) - 24L0*(q1^3)*(q2^2)*(xi^6) - 12L0*(q1^3)*q2*q3*(xi^6) - 24L0*(q1^3)*(q3^2)*(xi^6) + 21L0*(q1^2)*(q2^3)*(xi^6) + 9L0*(q1^2)*(q2^2)*q3*(xi^6) + 9L0*(q1^2)*q2*(q3^2)*(xi^6) + 21L0*(q1^2)*(q3^3)*(xi^6) - 12L0*q1*(q2^4)*(xi^6) + 6L0*q1*(q2^3)*q3*(xi^6) - 18L0*q1*(q2^2)*(q3^2)*(xi^6) + 6L0*q1*q2*(q3^3)*(xi^6) - 12L0*q1*(q3^4)*(xi^6) + 3L0*(q2^5)*(xi^6) - 3L0*(q2^4)*q3*(xi^6) + 3L0*(q2^3)*(q3^2)*(xi^6) + 3L0*(q2^2)*(q3^3)*(xi^6) - 3L0*q2*(q3^4)*(xi^6) + 3L0*(q3^5)*(xi^6) - 2(q1^6)*(xi^6) + 3(q1^5)*q2*(xi^6) + 3(q1^5)*q3*(xi^6) - 3(q1^4)*(q2^2)*(xi^6) + 6(q1^4)*q2*q3*(xi^6) - 3(q1^4)*(q3^2)*(xi^6) - (q1^3)*(q2^3)*(xi^6) - 9(q1^3)*(q2^2)*q3*(xi^6) - 9(q1^3)*q2*(q3^2)*(xi^6) - (q1^3)*(q3^3)*(xi^6) + 3(q1^2)*(q2^4)*(xi^6) + 12(q1^2)*(q2^3)*q3*(xi^6) + 12(q1^2)*q2*(q3^3)*(xi^6) + 3(q1^2)*(q3^4)*(xi^6) - 3q1*(q2^5)*(xi^6) - 3q1*(q2^4)*q3*(xi^6) - 3q1*(q2^3)*(q3^2)*(xi^6) - 3q1*(q2^2)*(q3^3)*(xi^6) - 3q1*q2*(q3^4)*(xi^6) - 3q1*(q3^5)*(xi^6) + (q2^6)*(xi^6) + 2(q2^3)*(q3^3)*(xi^6) + (q3^6)*(xi^6)) / (32805(r^5)) + (-6L0*q1*(xi^2) + 3L0*q2*(xi^2) + 3L0*q3*(xi^2) - 2(q1^2)*(xi^2) - q1*q2*(xi^2) - q1*q3*(xi^2) + (q2^2)*(xi^2) + 2q2*q3*(xi^2) + (q3^2)*(xi^2)) / (18r) + (6L0*(q1^3)*(xi^4) - 9L0*(q1^2)*q2*(xi^4) - 9L0*(q1^2)*q3*(xi^4) + 9L0*q1*(q2^2)*(xi^4) + 9L0*q1*(q3^2)*(xi^4) - 3L0*(q2^3)*(xi^4) - 3L0*(q3^3)*(xi^4) + 2(q1^4)*(xi^4) - (q1^3)*q2*(xi^4) - (q1^3)*q3*(xi^4) - 6(q1^2)*q2*q3*(xi^4) + 2q1*(q2^3)*(xi^4) + 3q1*(q2^2)*q3*(xi^4) + 3q1*q2*(q3^2)*(xi^4) + 2q1*(q3^3)*(xi^4) - (q2^4)*(xi^4) - (q2^3)*q3*(xi^4) - q2*(q3^3)*(xi^4) - (q3^4)*(xi^4)) / (486(r^3)) + (6L0*(q1^7)*(xi^8) - 21L0*(q1^6)*q2*(xi^8) - 21L0*(q1^6)*q3*(xi^8) + 45L0*(q1^5)*(q2^2)*(xi^8) + 36L0*(q1^5)*q2*q3*(xi^8) + 45L0*(q1^5)*(q3^2)*(xi^8) - 60L0*(q1^4)*(q2^3)*(xi^8) - 45L0*(q1^4)*(q2^2)*q3*(xi^8) - 45L0*(q1^4)*q2*(q3^2)*(xi^8) - 60L0*(q1^4)*(q3^3)*(xi^8) + 57L0*(q1^3)*(q2^4)*(xi^8) + 12L0*(q1^3)*(q2^3)*q3*(xi^8) + 72L0*(q1^3)*(q2^2)*(q3^2)*(xi^8) + 12L0*(q1^3)*q2*(q3^3)*(xi^8) + 57L0*(q1^3)*(q3^4)*(xi^8) - 36L0*(q1^2)*(q2^5)*(xi^8) + 9L0*(q1^2)*(q2^4)*q3*(xi^8) - 36L0*(q1^2)*(q2^3)*(q3^2)*(xi^8) - 36L0*(q1^2)*(q2^2)*(q3^3)*(xi^8) + 9L0*(q1^2)*q2*(q3^4)*(xi^8) - 36L0*(q1^2)*(q3^5)*(xi^8) + 15L0*q1*(q2^6)*(xi^8) - 18L0*q1*(q2^5)*q3*(xi^8) + 36L0*q1*(q2^4)*(q3^2)*(xi^8) - 24L0*q1*(q2^3)*(q3^3)*(xi^8) + 36L0*q1*(q2^2)*(q3^4)*(xi^8) - 18L0*q1*q2*(q3^5)*(xi^8) + 15L0*q1*(q3^6)*(xi^8) - 3L0*(q2^7)*(xi^8) + 6L0*(q2^6)*q3*(xi^8) - 9L0*(q2^5)*(q3^2)*(xi^8) + 3L0*(q2^4)*(q3^3)*(xi^8) + 3L0*(q2^3)*(q3^4)*(xi^8) - 9L0*(q2^2)*(q3^5)*(xi^8) + 6L0*q2*(q3^6)*(xi^8) - 3L0*(q3^7)*(xi^8) + 2(q1^8)*(xi^8) - 5(q1^7)*q2*(xi^8) - 5(q1^7)*q3*(xi^8) + 8(q1^6)*(q2^2)*(xi^8) - 2(q1^6)*q2*q3*(xi^8) + 8(q1^6)*(q3^2)*(xi^8) - 5(q1^5)*(q2^3)*(xi^8) + 12(q1^5)*(q2^2)*q3*(xi^8) + 12(q1^5)*q2*(q3^2)*(xi^8) - 5(q1^5)*(q3^3)*(xi^8) - (q1^4)*(q2^4)*(xi^8) - 31(q1^4)*(q2^3)*q3*(xi^8) - 6(q1^4)*(q2^2)*(q3^2)*(xi^8) - 31(q1^4)*q2*(q3^3)*(xi^8) - (q1^4)*(q3^4)*(xi^8) + 7(q1^3)*(q2^5)*(xi^8) + 26(q1^3)*(q2^4)*q3*(xi^8) + 16(q1^3)*(q2^3)*(q3^2)*(xi^8) + 16(q1^3)*(q2^2)*(q3^3)*(xi^8) + 26(q1^3)*q2*(q3^4)*(xi^8) + 7(q1^3)*(q3^5)*(xi^8) - 7(q1^2)*(q2^6)*(xi^8) - 15(q1^2)*(q2^5)*q3*(xi^8) + 3(q1^2)*(q2^4)*(q3^2)*(xi^8) - 32(q1^2)*(q2^3)*(q3^3)*(xi^8) + 3(q1^2)*(q2^2)*(q3^4)*(xi^8) - 15(q1^2)*q2*(q3^5)*(xi^8) - 7(q1^2)*(q3^6)*(xi^8) + 4q1*(q2^7)*(xi^8) + q1*(q2^6)*q3*(xi^8) + 3q1*(q2^5)*(q3^2)*(xi^8) + 5q1*(q2^4)*(q3^3)*(xi^8) + 5q1*(q2^3)*(q3^4)*(xi^8) + 3q1*(q2^2)*(q3^5)*(xi^8) + q1*q2*(q3^6)*(xi^8) + 4q1*(q3^7)*(xi^8) - (q2^8)*(xi^8) + (q2^7)*q3*(xi^8) - (q2^6)*(q3^2)*(xi^8) - 2(q2^5)*(q3^3)*(xi^8) + 2(q2^4)*(q3^4)*(xi^8) - 2(q2^3)*(q3^5)*(xi^8) - (q2^2)*(q3^6)*(xi^8) + q2*(q3^7)*(xi^8) - (q3^8)*(xi^8)) / (4133430(r^7))


p1_1_int = sympy.integrate(p1_1, (xi, 0, 1))
p1_1_int = sympy.simplify(p1_1_int)

p1_1_int_julia = sympy.julia_code(p1_1_int)


question symbolics integral sympy modelingtoolkit

You don’t need the Symbolics.jl package at all for this. Once you have Julia code as a string from SymPy, you can just parse it and evaluate it into a function.

Unfortunately, it looks like sympy.julia_code produces invalid Julia code, because it thinks it is a good idea to produce a “vectorized” expression but it uses invalid syntax (it generates strings like q2.^5.*q3, where the second . is ambiguous). (I guess, coming from Python, they mistakenly think that it’s a good idea to “vectorize” everything, rather than putting it into a scalar function and vectorizing at call-time if needed.) Fortunately, this is easily fixed by just replacing the dotted operators with non-dotted versions:

p1_1_int_julia_fixed = replace(p1_1_int_julia, r"\.([/*+^])" => s"\1")

which you can then parse and put into a function, e.g.

@eval myfunc(q1, q2, q3, xi, r, L0) = $(Meta.parse(p1_1_int_julia_fixed))
1 Like

You might also consider

@eval @fastmath myfunc(q1, q2, q3, xi, r, L0) = $(Meta.parse(p1_1_int_julia_fixed))

Using @fastmath is about 16x faster for this function on my machine, at the expense of slighly reduced accuracy, I think because it allows it to re-use multiplications for all of the powers that you compute, as well as computing large integer powers more quickly (albeit slightly less accurately).

1 Like

Thank you so much for your response! The code you provided worked perfectly. I have a follow-up question, though. I am trying to use build_function from Symbolics. The code I shared is just one part of my project, and I have several similar expressions. I also want to use these expressions for forward manipulation, such as calculating Jacobians, derivatives, etc., using Symbolics. Could you please guide me on how to achieve this? The following is what I want to do.

using PyCall        # for calling Python
using Symbolics     # for symbolic manipulations in Julia

sympy = pyimport("sympy")


q1 = sympy.Symbol("q1", real=true)
q2 = sympy.Symbol("q2", real=true)
q3= sympy.Symbol("q3", real=true)
xi = sympy.Symbol("xi", real=true)
r  = sympy.Symbol("r",  positive=true, real=true)
L0 = sympy.Symbol("L0", positive=true, real=true)


p1_1 = (-6L0*(q1^9)*(xi^10) + 27L0*(q1^8)*q2*(xi^10) + 27L0*(q1^8)*q3*(xi^10) - 72L0*(q1^7)*(q2^2)*(xi^10) - 72L0*(q1^7)*q2*q3*(xi^10) - 72L0*(q1^7)*(q3^2)*(xi^10) + 126L0*(q1^6)*(q2^3)*(xi^10) + 126L0*(q1^6)*(q2^2)*q3*(xi^10) + 126L0*(q1^6)*q2*(q3^2)*(xi^10) + 126L0*(q1^6)*(q3^3)*(xi^10) - 162L0*(q1^5)*(q2^4)*(xi^10) - 108L0*(q1^5)*(q2^3)*q3*(xi^10) - 216L0*(q1^5)*(q2^2)*(q3^2)*(xi^10) - 108L0*(q1^5)*q2*(q3^3)*(xi^10) - 162L0*(q1^5)*(q3^4)*(xi^10) + 153L0*(q1^4)*(q2^5)*(xi^10) + 45L0*(q1^4)*(q2^4)*q3*(xi^10) + 180L0*(q1^4)*(q2^3)*(q3^2)*(xi^10) + 180L0*(q1^4)*(q2^2)*(q3^3)*(xi^10) + 45L0*(q1^4)*q2*(q3^4)*(xi^10) + 153L0*(q1^4)*(q3^5)*(xi^10) - 108L0*(q1^3)*(q2^6)*(xi^10) + 36L0*(q1^3)*(q2^5)*q3*(xi^10) - 180L0*(q1^3)*(q2^4)*(q3^2)*(xi^10) - 180L0*(q1^3)*(q2^2)*(q3^4)*(xi^10) + 36L0*(q1^3)*q2*(q3^5)*(xi^10) - 108L0*(q1^3)*(q3^6)*(xi^10) + 54L0*(q1^2)*(q2^7)*(xi^10) - 54L0*(q1^2)*(q2^6)*q3*(xi^10) + 108L0*(q1^2)*(q2^5)*(q3^2)*(xi^10) + 108L0*(q1^2)*(q2^2)*(q3^5)*(xi^10) - 54L0*(q1^2)*q2*(q3^6)*(xi^10) + 54L0*(q1^2)*(q3^7)*(xi^10) - 18L0*q1*(q2^8)*(xi^10) + 36L0*q1*(q2^7)*q3*(xi^10) - 72L0*q1*(q2^6)*(q3^2)*(xi^10) + 72L0*q1*(q2^5)*(q3^3)*(xi^10) - 90L0*q1*(q2^4)*(q3^4)*(xi^10) + 72L0*q1*(q2^3)*(q3^5)*(xi^10) - 72L0*q1*(q2^2)*(q3^6)*(xi^10) + 36L0*q1*q2*(q3^7)*(xi^10) - 18L0*q1*(q3^8)*(xi^10) + 3L0*(q2^9)*(xi^10) - 9L0*(q2^8)*q3*(xi^10) + 18L0*(q2^7)*(q3^2)*(xi^10) - 18L0*(q2^6)*(q3^3)*(xi^10) + 9L0*(q2^5)*(q3^4)*(xi^10) + 9L0*(q2^4)*(q3^5)*(xi^10) - 18L0*(q2^3)*(q3^6)*(xi^10) + 18L0*(q2^2)*(q3^7)*(xi^10) - 9L0*q2*(q3^8)*(xi^10) + 3L0*(q3^9)*(xi^10) - 2(q1^10)*(xi^10) + 7(q1^9)*q2*(xi^10) + 7(q1^9)*q3*(xi^10) - 15(q1^8)*(q2^2)*(xi^10) - 6(q1^8)*q2*q3*(xi^10) - 15(q1^8)*(q3^2)*(xi^10) + 18(q1^7)*(q2^3)*(xi^10) - 6(q1^7)*(q2^2)*q3*(xi^10) - 6(q1^7)*q2*(q3^2)*(xi^10) + 18(q1^7)*(q3^3)*(xi^10) - 12(q1^6)*(q2^4)*(xi^10) + 48(q1^6)*(q2^3)*q3*(xi^10) + 12(q1^6)*(q2^2)*(q3^2)*(xi^10) + 48(q1^6)*q2*(q3^3)*(xi^10) - 12(q1^6)*(q3^4)*(xi^10) - 3(q1^5)*(q2^5)*(xi^10) - 75(q1^5)*(q2^4)*q3*(xi^10) - 48(q1^5)*(q2^3)*(q3^2)*(xi^10) - 48(q1^5)*(q2^2)*(q3^3)*(xi^10) - 75(q1^5)*q2*(q3^4)*(xi^10) - 3(q1^5)*(q3^5)*(xi^10) + 15(q1^4)*(q2^6)*(xi^10) + 78(q1^4)*(q2^5)*q3*(xi^10) + 15(q1^4)*(q2^4)*(q3^2)*(xi^10) + 120(q1^4)*(q2^3)*(q3^3)*(xi^10) + 15(q1^4)*(q2^2)*(q3^4)*(xi^10) + 78(q1^4)*q2*(q3^5)*(xi^10) + 15(q1^4)*(q3^6)*(xi^10) - 18(q1^3)*(q2^7)*(xi^10) - 42(q1^3)*(q2^6)*q3*(xi^10) - 12(q1^3)*(q2^5)*(q3^2)*(xi^10) - 60(q1^3)*(q2^4)*(q3^3)*(xi^10) - 60(q1^3)*(q2^3)*(q3^4)*(xi^10) - 12(q1^3)*(q2^2)*(q3^5)*(xi^10) - 42(q1^3)*q2*(q3^6)*(xi^10) - 18(q1^3)*(q3^7)*(xi^10) + 12(q1^2)*(q2^8)*(xi^10) + 12(q1^2)*(q2^7)*q3*(xi^10) - 6(q1^2)*(q2^6)*(q3^2)*(xi^10) + 60(q1^2)*(q2^5)*(q3^3)*(xi^10) - 30(q1^2)*(q2^4)*(q3^4)*(xi^10) + 60(q1^2)*(q2^3)*(q3^5)*(xi^10) - 6(q1^2)*(q2^2)*(q3^6)*(xi^10) + 12(q1^2)*q2*(q3^7)*(xi^10) + 12(q1^2)*(q3^8)*(xi^10) - 5q1*(q2^9)*(xi^10) + 3q1*(q2^8)*q3*(xi^10) - 6q1*(q2^7)*(q3^2)*(xi^10) - 6q1*(q2^6)*(q3^3)*(xi^10) - 3q1*(q2^5)*(q3^4)*(xi^10) - 3q1*(q2^4)*(q3^5)*(xi^10) - 6q1*(q2^3)*(q3^6)*(xi^10) - 6q1*(q2^2)*(q3^7)*(xi^10) + 3q1*q2*(q3^8)*(xi^10) - 5q1*(q3^9)*(xi^10) + (q2^10)*(xi^10) - 2(q2^9)*q3*(xi^10) + 3(q2^8)*(q3^2)*(xi^10) - 3(q2^6)*(q3^4)*(xi^10) + 6(q2^5)*(q3^5)*(xi^10) - 3(q2^4)*(q3^6)*(xi^10) + 3(q2^2)*(q3^8)*(xi^10) - 2q2*(q3^9)*(xi^10) + (q3^10)*(xi^10)) / (837019575(r^9)) + (-6L0*(q1^5)*(xi^6) + 15L0*(q1^4)*q2*(xi^6) + 15L0*(q1^4)*q3*(xi^6) - 24L0*(q1^3)*(q2^2)*(xi^6) - 12L0*(q1^3)*q2*q3*(xi^6) - 24L0*(q1^3)*(q3^2)*(xi^6) + 21L0*(q1^2)*(q2^3)*(xi^6) + 9L0*(q1^2)*(q2^2)*q3*(xi^6) + 9L0*(q1^2)*q2*(q3^2)*(xi^6) + 21L0*(q1^2)*(q3^3)*(xi^6) - 12L0*q1*(q2^4)*(xi^6) + 6L0*q1*(q2^3)*q3*(xi^6) - 18L0*q1*(q2^2)*(q3^2)*(xi^6) + 6L0*q1*q2*(q3^3)*(xi^6) - 12L0*q1*(q3^4)*(xi^6) + 3L0*(q2^5)*(xi^6) - 3L0*(q2^4)*q3*(xi^6) + 3L0*(q2^3)*(q3^2)*(xi^6) + 3L0*(q2^2)*(q3^3)*(xi^6) - 3L0*q2*(q3^4)*(xi^6) + 3L0*(q3^5)*(xi^6) - 2(q1^6)*(xi^6) + 3(q1^5)*q2*(xi^6) + 3(q1^5)*q3*(xi^6) - 3(q1^4)*(q2^2)*(xi^6) + 6(q1^4)*q2*q3*(xi^6) - 3(q1^4)*(q3^2)*(xi^6) - (q1^3)*(q2^3)*(xi^6) - 9(q1^3)*(q2^2)*q3*(xi^6) - 9(q1^3)*q2*(q3^2)*(xi^6) - (q1^3)*(q3^3)*(xi^6) + 3(q1^2)*(q2^4)*(xi^6) + 12(q1^2)*(q2^3)*q3*(xi^6) + 12(q1^2)*q2*(q3^3)*(xi^6) + 3(q1^2)*(q3^4)*(xi^6) - 3q1*(q2^5)*(xi^6) - 3q1*(q2^4)*q3*(xi^6) - 3q1*(q2^3)*(q3^2)*(xi^6) - 3q1*(q2^2)*(q3^3)*(xi^6) - 3q1*q2*(q3^4)*(xi^6) - 3q1*(q3^5)*(xi^6) + (q2^6)*(xi^6) + 2(q2^3)*(q3^3)*(xi^6) + (q3^6)*(xi^6)) / (32805(r^5)) + (-6L0*q1*(xi^2) + 3L0*q2*(xi^2) + 3L0*q3*(xi^2) - 2(q1^2)*(xi^2) - q1*q2*(xi^2) - q1*q3*(xi^2) + (q2^2)*(xi^2) + 2q2*q3*(xi^2) + (q3^2)*(xi^2)) / (18r) + (6L0*(q1^3)*(xi^4) - 9L0*(q1^2)*q2*(xi^4) - 9L0*(q1^2)*q3*(xi^4) + 9L0*q1*(q2^2)*(xi^4) + 9L0*q1*(q3^2)*(xi^4) - 3L0*(q2^3)*(xi^4) - 3L0*(q3^3)*(xi^4) + 2(q1^4)*(xi^4) - (q1^3)*q2*(xi^4) - (q1^3)*q3*(xi^4) - 6(q1^2)*q2*q3*(xi^4) + 2q1*(q2^3)*(xi^4) + 3q1*(q2^2)*q3*(xi^4) + 3q1*q2*(q3^2)*(xi^4) + 2q1*(q3^3)*(xi^4) - (q2^4)*(xi^4) - (q2^3)*q3*(xi^4) - q2*(q3^3)*(xi^4) - (q3^4)*(xi^4)) / (486(r^3)) + (6L0*(q1^7)*(xi^8) - 21L0*(q1^6)*q2*(xi^8) - 21L0*(q1^6)*q3*(xi^8) + 45L0*(q1^5)*(q2^2)*(xi^8) + 36L0*(q1^5)*q2*q3*(xi^8) + 45L0*(q1^5)*(q3^2)*(xi^8) - 60L0*(q1^4)*(q2^3)*(xi^8) - 45L0*(q1^4)*(q2^2)*q3*(xi^8) - 45L0*(q1^4)*q2*(q3^2)*(xi^8) - 60L0*(q1^4)*(q3^3)*(xi^8) + 57L0*(q1^3)*(q2^4)*(xi^8) + 12L0*(q1^3)*(q2^3)*q3*(xi^8) + 72L0*(q1^3)*(q2^2)*(q3^2)*(xi^8) + 12L0*(q1^3)*q2*(q3^3)*(xi^8) + 57L0*(q1^3)*(q3^4)*(xi^8) - 36L0*(q1^2)*(q2^5)*(xi^8) + 9L0*(q1^2)*(q2^4)*q3*(xi^8) - 36L0*(q1^2)*(q2^3)*(q3^2)*(xi^8) - 36L0*(q1^2)*(q2^2)*(q3^3)*(xi^8) + 9L0*(q1^2)*q2*(q3^4)*(xi^8) - 36L0*(q1^2)*(q3^5)*(xi^8) + 15L0*q1*(q2^6)*(xi^8) - 18L0*q1*(q2^5)*q3*(xi^8) + 36L0*q1*(q2^4)*(q3^2)*(xi^8) - 24L0*q1*(q2^3)*(q3^3)*(xi^8) + 36L0*q1*(q2^2)*(q3^4)*(xi^8) - 18L0*q1*q2*(q3^5)*(xi^8) + 15L0*q1*(q3^6)*(xi^8) - 3L0*(q2^7)*(xi^8) + 6L0*(q2^6)*q3*(xi^8) - 9L0*(q2^5)*(q3^2)*(xi^8) + 3L0*(q2^4)*(q3^3)*(xi^8) + 3L0*(q2^3)*(q3^4)*(xi^8) - 9L0*(q2^2)*(q3^5)*(xi^8) + 6L0*q2*(q3^6)*(xi^8) - 3L0*(q3^7)*(xi^8) + 2(q1^8)*(xi^8) - 5(q1^7)*q2*(xi^8) - 5(q1^7)*q3*(xi^8) + 8(q1^6)*(q2^2)*(xi^8) - 2(q1^6)*q2*q3*(xi^8) + 8(q1^6)*(q3^2)*(xi^8) - 5(q1^5)*(q2^3)*(xi^8) + 12(q1^5)*(q2^2)*q3*(xi^8) + 12(q1^5)*q2*(q3^2)*(xi^8) - 5(q1^5)*(q3^3)*(xi^8) - (q1^4)*(q2^4)*(xi^8) - 31(q1^4)*(q2^3)*q3*(xi^8) - 6(q1^4)*(q2^2)*(q3^2)*(xi^8) - 31(q1^4)*q2*(q3^3)*(xi^8) - (q1^4)*(q3^4)*(xi^8) + 7(q1^3)*(q2^5)*(xi^8) + 26(q1^3)*(q2^4)*q3*(xi^8) + 16(q1^3)*(q2^3)*(q3^2)*(xi^8) + 16(q1^3)*(q2^2)*(q3^3)*(xi^8) + 26(q1^3)*q2*(q3^4)*(xi^8) + 7(q1^3)*(q3^5)*(xi^8) - 7(q1^2)*(q2^6)*(xi^8) - 15(q1^2)*(q2^5)*q3*(xi^8) + 3(q1^2)*(q2^4)*(q3^2)*(xi^8) - 32(q1^2)*(q2^3)*(q3^3)*(xi^8) + 3(q1^2)*(q2^2)*(q3^4)*(xi^8) - 15(q1^2)*q2*(q3^5)*(xi^8) - 7(q1^2)*(q3^6)*(xi^8) + 4q1*(q2^7)*(xi^8) + q1*(q2^6)*q3*(xi^8) + 3q1*(q2^5)*(q3^2)*(xi^8) + 5q1*(q2^4)*(q3^3)*(xi^8) + 5q1*(q2^3)*(q3^4)*(xi^8) + 3q1*(q2^2)*(q3^5)*(xi^8) + q1*q2*(q3^6)*(xi^8) + 4q1*(q3^7)*(xi^8) - (q2^8)*(xi^8) + (q2^7)*q3*(xi^8) - (q2^6)*(q3^2)*(xi^8) - 2(q2^5)*(q3^3)*(xi^8) + 2(q2^4)*(q3^4)*(xi^8) - 2(q2^3)*(q3^5)*(xi^8) - (q2^2)*(q3^6)*(xi^8) + q2*(q3^7)*(xi^8) - (q3^8)*(xi^8)) / (4133430(r^7))


p1_1_int = sympy.integrate(p1_1, (xi, 0, 1))
p1_1_int = sympy.simplify(p1_1_int)

p1_1_int_julia = sympy.julia_code(p1_1_int)

p1_1_int_julia_fixed = replace(p1_1_int_julia, r"\.([/*+^])" => s"\1")


# something like this for differentiation

# Something like this for generating the function
@variables q[1:3] xi r L0
myfunc = Symbolics.build_function(p1_1_int_julia_fixed, expression=Val{true})[2]
# something like this for differentiation
p1_1_int_julia_fixed_diff = Symbolics.derivative(p1_1_int_julia_fixed, q1) #(or q[1] prefereablly)#)

I was able to make it work and generate the code. Below is a function for anyone who might want to use it in the future:

function SymToJulia(expr)
    # Convert symbolic expression to Julia code
    expr_julia = sympy.julia_code(expr)

    # Fix the generated Julia code by replacing operations
    expr_fixed = replace(expr_julia, r"\.([/*+^])" => s"\1")

    # Parse the fixed Julia code
    expr_parsed = Meta.parse(expr_fixed)
    # Evaluate parsed code 
    # Return the evaluated result
    return expr_parsed
end

Then you need to redefine your variables and evaluate the expr_parsed

@variables a b c d e
output = eval(expr_parsed)
input = [a,b,c,d,e]

In the next step, you can generate your function:

func = Symbolics.build_function(output, input, expression=Val{true})[2]

It might be easiest to just use the conversion from SymPy to Symbolics and then call build_function?

Hello Chris,

Thank you for your reply. I didn’t know this was possible. Could you please direct me to an example or some code that demonstrates this?

I have another, more important question. After calculating my functions and calling build_function, it seems that because my expression is lengthy, the function generated by build_function cannot be parsed, and I’m encountering errors afterward. Do you have any workaround for this issue? I have also reported this on GitHub.

I should mention it is not for the expression in the codes above, it is a more complex expression.

Your example there doesn’t call build_function or use Symbolics at all?

In the library we have symbolics_to_sympy:

while for the other direction it’s currently mentioned in an issue:

It would be good to get that documented better.

I’ll include the code here so you can reproduce the issue. Please note that this is just one of my terms, and I have a total of 12. I am able to generate the function (both for the example provided and the one with 12 outputs). However, Julia crashes when I try to use it by including the generated function. My motivation for this transition was to transfer my functions from MATLAB and Python to Julia to take advantage of its speed, automatic differentiation, and other features for my optimization problem.

This is the first code, that I am generating the function using Symbolics.build_function It will take some time to generate. You can also download the KinFuncComplete6.jl that I’ve attached.
KinFuncComplete6.jl (3.1 MB)

using Symbolics 
using LinearAlgebra
import SymbolicNumericIntegration: integrate as int
using PyCall        # for calling Python

sympy = pyimport("sympy")

q = [sympy.Symbol("q[$i]", real=true) for i in 1:3]

# Define other symbols
xi = sympy.Symbol("xi", real=true)
r  = sympy.Symbol("r", positive=true, real=true)
L0 = sympy.Symbol("L0", positive=true, real=true)

# Define symbolic variables
A1 = q[1]^2 + q[2]^2 + q[3]^2 - q[1]*q[3] - q[2]*q[3] - q[1]*q[2]
A2 = 2*q[1] - q[2] - q[3]
A3 = q[2] - q[3]
A4 = 3*L0 + q[1] + q[2] + q[3]

# Preallocate R and p
T = sympy.zeros(4, 4)


# Define p elements
T[1,4] = - (A2 * A1^4 * A4 * xi^10) / (837019575 * r^9) +
           (A2 * A1^3 * A4 * xi^8) / (4133430 * r^7) -
           (A2 * A1^2 * A4 * xi^6) / (32805 * r^5) +
           (A2 * A1 * A4 * xi^4) / (486 * r^3) -
           (A2 * A4 * xi^2) / (18 * r)

T[2,4] = - (sqrt(3) * A3 * A1^4 * A4 * xi^10) / (837019575 * r^9) +
           (sqrt(3) * A3 * A1^3 * A4 * xi^8) / (4133430 * r^7) -
           (sqrt(3) * A3 * A1^2 * A4 * xi^6) / (32805 * r^5) +
           (sqrt(3) * A3 * A1 * A4 * xi^4) / (486 * r^3) -
           (sqrt(3) * A3 * A4 * xi^2) / (18 * r)

T[3,4] = (2 * A1^4 * A4 * xi^9) / (55801305 * r^8) -
           (4 * A1^3 * A4 * xi^7) / (688905 * r^6) +
           (2 * A1^2 * A4 * xi^5) / (3645 * r^4) -
           (2 * A1 * A4 * xi^3) / (81 * r^2) +
           (A4 * xi) / 3


T[4, 4] = 1
T = sympy.simplify(T)   
R = T.extract(0:2,0:2)
p = T.extract(0:2,3:3)

p1_p1_transpose = p * p.transpose()
p1_p1_transpose_int = sympy.integrate(p1_p1_transpose, (xi, 0, 1))
p1_p1_transpose_int = sympy.simplify(p1_p1_transpose_int)


println("Finished Integration")


function SymToJulia(expr)
    # Convert symbolic expression to Julia code
    expr_julia = sympy.julia_code(expr)

    # Fix the generated Julia code by replacing operations
    expr_fixed = replace(expr_julia, r"\.([/*+^])" => s"\1")

    # Parse the fixed Julia code
    expr_parsed = Meta.parse(expr_fixed)
    # Evaluate parsed code to generate numeric or symbolic results
    # Return the evaluated result
    return expr_parsed
end

p1_p1_transpose_int_julia = SymToJulia(p1_p1_transpose_int)


# Define variables
@variables xi r L0 q[1:3]
# Evaluate the expressions

p1_p1_transpose_int_eval = eval(p1_p1_transpose_int_julia)

input = [q, r, xi, L0]

KinFuncComplete6 = Symbolics.build_function(p1_p1_transpose_int_eval, input, expression=Val{true})[2]   


write("KinFuncComplete6.jl", string(KinFuncComplete6))

println("Finished Writing")

In the next step, I want to use this function in a separate code as follows

using Symbolics
using NaNMath
println("code starts here")
const Kin6 = include("KinFuncComplete6.jl")




p1_p1_transpose_int = zeros(3,3)


q = [0.06,0.00,0.02]
r = 24e-3
xi = 1
L0 = 0.15
input = [q, r, xi, L0]

Kin6(p1_p1_transpose_int, input)



Then I will get the crash error which I included in the issue on GitHub.