Multivariable numerical-symbolic integration
I need to find the symbolic expression of a multivariable integral. The real integrand contains 11 variables (I have to integrate "only" four of them) so example code is simplified here:
x, y, z = var('x','y','z')
integrand = sin(x)*cos(y)*z
result = integrand.integral(x, 0, pi).integral(z, 0, 1)
It works just fine generally but given the complexity of the integral no algorithm gives me a result and it returns just:
integrate(integrate(sin(x)*cos(y), x, 0, pi), z, 0, 1)
Is there a built in way to numerically evaluate an integral on some variables that returns symbolic result with the numerical integration found coefficients (or constants)? Namely, in this case:
cos(y)
EDIT1: I managed to get a very very simple example of the function I need:
def numsym_integral( f, variable, a, b, points = 1000):
dx = (b-a)/points
result = 0
for i in range(0,points):
result = result + f.substitute({variable:a + i*dx}) * dx
return result
It still doesn't work though in my specific case because of the complexity of the expression. I get the number of terms gets multiplied by "points" per integration, leading to something too big. Could something built in be more efficient?
Don't you mean :
?
In so, the numerical equivalent would be
Illustration :
No, I didn't mean that. My bad though, I've not explained clearly enough, I just edited the example code to make it clearer and added a (not working in my case) not built in solution to better explain what I mean.
About your second edit : What you have programmed is a simple version (constant step) of trapeze integration.
numerical_integral
has lots of further sophistication allowing integration in cases where the trapeze rule fails miserably (singularities, infinite bounds, etc...).I fail to understand the problem you are trying to solve...
From what I've understood on the docs
numerical_integral
forces you to set the value of every other non integrating variable in your integrand. I don't need a number, I possibly need an expression.That's why you have to nest
numerical_integral
calls : the first argument must be numerically evaluable at run time (i. e. no symbolic variables).In other words, the value of a
numerical_integral
call is a numeric value, not an expression...