| 1 | initial version |
I'm interpreting your question as: Is there a sage function which will give a symbolic solution to an integral if a closed form exists and a numeric solution otherwise. To my knowledge there is not though the following function may be what you are asking for:
def sym_or_num_Integral(f,variables,lower_bound=[None],upper_bound=[None]):
if isinstance(variables,list):
if not isinstance(lower_bound,list):
lower_bound=[lower_bound]
while len(lower_bound)!=len(variables):
if len(lower_bound)>len(variables): break
lower_bound.append(None)
if not isinstance(upper_bound,list):
upper_bound=[upper_bound]
while len(upper_bound) != len(variables):
if len(lower_bound)>len(variables): break
upper_bound.append(None)
if len(variables)==1:
return sym_or_num_Integral(f,variables[0],lower_bound[0],upper_bound[0])
inputs_inner=[variables[0],lower_bound[0],upper_bound[0]]
inputs_outer=[variables[1:],lower_bound[1:],upper_bound[1:]]
return sym_or_num_Integral(sym_or_num_Integral(f,*inputs_inner),*inputs_outer)
result=integral(f,variables,lower_bound,upper_bound)
if 'integrate' in str(result):
return result.n()
else:
return result
The method of checking if the solution is a closed form is quite hacky and I'd welcome and improvement too it. This function can do any number of integrals so long as you input the parameters as a list, i.e. variables=[x,y], lower_bound=[x_lower,y_lower]. Two examples:
sage: var('x y')
sage: sym_or_num_Integral(sin(x)*y,[x,y],[0,0],[2,2])
-2*cos(2) + 2
sage: sym_or_num_Integral(sin(x*y),[x,y],[0,0],[2,2])
2.1044917239083536
You can have the integral be definite in any subset (must include first variable) of the variable and not the others:
sage: sym_or_num_Integral(sin(x)*y,[x,y],[0,None],[2,None]) -1/2*y^2*(cos(2) - 1)
have lower_bound=[None,3],upper_bound[3,6], that is you can have only one of the bounds be definite.
Was this all you were looking for?
| 2 | No.2 Revision |
I'm interpreting your question as: Is there a sage function which will give a symbolic solution to an integral if a closed form exists and a numeric solution otherwise. To my knowledge there is not though the following function may be what you are asking for:
def sym_or_num_Integral(f,variables,lower_bound=[None],upper_bound=[None]):
if isinstance(variables,list):
if not isinstance(lower_bound,list):
lower_bound=[lower_bound]
while len(lower_bound)!=len(variables):
if len(lower_bound)>len(variables): break
lower_bound.append(None)
if not isinstance(upper_bound,list):
upper_bound=[upper_bound]
while len(upper_bound) != len(variables):
if len(lower_bound)>len(variables): break
upper_bound.append(None)
if len(variables)==1:
return sym_or_num_Integral(f,variables[0],lower_bound[0],upper_bound[0])
inputs_inner=[variables[0],lower_bound[0],upper_bound[0]]
inputs_outer=[variables[1:],lower_bound[1:],upper_bound[1:]]
return sym_or_num_Integral(sym_or_num_Integral(f,*inputs_inner),*inputs_outer)
result=integral(f,variables,lower_bound,upper_bound)
if 'integrate' in str(result):
return result.n()
else:
return result
The method of checking if the solution is a closed form is quite hacky and I'd welcome and improvement too it. This function can do any number of integrals so long as you input the parameters as a list, i.e. variables=[x,y], lower_bound=[x_lower,y_lower]. Two examples:
sage: var('x y')
sage: sym_or_num_Integral(sin(x)*y,[x,y],[0,0],[2,2])
-2*cos(2) + 2
sage: sym_or_num_Integral(sin(x*y),[x,y],[0,0],[2,2])
2.1044917239083536
You can have the integral be definite in any subset (must include first variable) of the variable and not the others:
sage: sym_or_num_Integral(sin(x)*y,[x,y],[0,None],[2,None]) -1/2*y^2*(cos(2) - 1)
have lower_bound=[None,3],upper_bound[3,6], that is you can have only one of the bounds be definite.
Was this all you were looking for?
Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.