Theoretical details regarding symbolic integration in Matlab

5 visualizzazioni (ultimi 30 giorni)
Dear all,
I am using symbolic integration in Matlab (in particular the "int"-function). I would like to use it as a reference in my research. Therefore, it would be nice to obtain some details which methods Matlab is actually using. Does anybody know? Is there a source to get more details?
Best,
Michael

Risposta accettata

Walter Roberson
Walter Roberson il 19 Ago 2024
The symbolic integration methods are undocumented.
The integration methods are very likely table driven: some pattern matching is done and various integration methods are attempted until eventually one works (or none of them work.)
Forming the grobnar basis is one of the potential steps.
For what it is worth, you can examine code:
regexprep(char(evalin(symengine, 'expose(int)')), '\\n', '\n')
ans =
'proc(f, x = null()) name int; local integral, xx, a, b, prop, unevaluated_int, options, optseq, u, errtext; option hold; begin if args(0) = 0 then error(message(\"symbolic:int:NoArgument\")) end_if; x := context(x); optseq := context(args(3..args(0))); if testtype(x, \"_exprseq\") then optseq := (x[2..-1], optseq); x := x[1] end_if; options := intlib::getOptions(optseq); if options[Hold] then return(hold(int)(context(f), x, optseq)) end_if; if type(x) = \"_equal\" && type(rhs(x)) = \"_range\" && type(lhs(x)) ~= \"_mult\" then xx := op(x, 1); if domtype(xx) ~= DOM_IDENT then error(message(\"symbolic:int:VariableMustBeIdentifier2\")) end_if; a := op(op(x, 2), 1); b := op(op(x, 2), 2); if protected(xx) ~= None then develinfo(1, \"\".xx.\" is protected, can't do assumptions early on\") else if options[hold(Assumptions)] ~= FALSE then if is(a <= b) = UNKNOWN && intlib::printWarningsFlag && options[NoWarning] ~= TRUE then warning(message(\"symbolic:int:Assuming\", a <= b)) end_if; prop := Dom::Interval([a, b]); if type(prop) = Dom::Interval || prop = R_ then if property::hasprop(xx) then if intlib::printWarningsFlag && options[NoWarning] ~= TRUE && getprop(xx) ~= prop then warning(message(\"symbolic:int:ChangingProperties2\", xx, prop, getprop(xx))) end_if; unassume(xx) end_if; if is(b < a) = TRUE then assumeAlso(xx in Dom::Interval([b, a])) else if is(a <= b) = TRUE then assumeAlso(xx in Dom::Interval([a, b])) else assumeAlso(xx in R_) end_if end_if end_if end_if end_if else if type(x) = \"_equal\" && type(lhs(x)) = \"_mult\" then xx := op(x, 1); a := op(op(x, 2), 1); b := op(op(x, 2), 2); [u, xx] := split(xx, unit::isUnit)[1..2]; return(context(hold(int)(f, xx = a/u..b/u, options))*u) else if type(x) = \"_mult\" then [u, x] := split(x, unit::isUnit)[1..2]; return(context(hold(int)(f, x, options))*u) end_if end_if end_if; f := hold(hold)(context(f)); if testargs() && has(context([args()]), FAIL) then error(message(\"symbolic:int:InvalidArgument\")) end_if; if has(context([args()]), undefined) then return(undefined) end_if; assert(op(f, 0) = hold(hold)); f := op(f); if f::dom::int ~= FAIL then return(f::dom::int(f, x, context(args(3..args(0))))) else if domtype(f) = DOM_EXPR && domtype(eval(op(f, 0))) = DOM_FUNC_ENV && (eval(op(f, 0)))::int ~= FAIL then return((eval(op(f, 0)))::int(f, x, context(args(3..args(0))))) else if testtype(f, Type::Arithmetical) = FALSE then error(message(\"symbolic:int:InvalidIntegrand\")) end_if end_if end_if; if args(0) = 1 then error(message(\"symbolic:int:MissingSecondArgument\")) end_if; if testtype(x, \"_exprseq\") then options := intlib::getOptions(x[2..-1], options); x := op(x, 1) end_if; if domtype(x) = DOM_IDENT then integral := hold(int)(f, x, context(args(3..args(0)))); traperror((integral := intlib::int(f, x, options))); integral := subs(integral, hold(intlib::frozenInt) = hold(int), Unsimplified); unevaluated_int := FALSE; if domtype(integral) ~= piecewise || domtype(piecewise::disregardPoints(integral)) ~= piecewise then misc::maprec(piecewise::disregardPoints(integral), {\"int\"} = (i -> (if op(i, [2, 1]) = op(DOM_VAR(1,13), 1) then DOM_VAR(1,7) := TRUE; misc::breakmap() end_if; i)), Unsimplified) end_if; if unevaluated_int && ~options[hold(AlwaysExtractIntegrableParts)] = TRUE && 100 + intlib::Simplify::defaultValuation(hold(int)(f, x)) < intlib::Simplify::defaultValuation(integral) then return(hold(int)(f, x, intlib::printOptions(options, x))) end_if; if ~unevaluated_int && hastype(integral, piecewise) then integral := subs(integral, hold(int) = hold(intlib::frozenInt), Unsimplified); integral := misc::maprec(integral, {piecewise} = (p -> piecewise::mapConditions(p, simplify::simplifyCondition))) assumingAlso f in C_; integral := subs(integral, hold(intlib::frozenInt) = hold(int), Unsimplified) end_if; return(integral) else if type(x) = \"_equal\" && type(op(x, 2)) = \"_range\" then intlib::xrngTest(x); integral := hold(int)(f, x, context(args(3..args(0)))); if traperror((integral := intlib::defInt(f, x, options))) = 1028 then errtext := getlasterror()[2]; if stringlib::contains(errtext, (message(\"symbolic:int:InvalidBorder\"))::getString()) then error(message(\"symbolic:int:InvalidBorder\")) end_if; if stringlib::contains(errtext, (message(\"symbolic:int:DifferentRealParts\"))::getString()) then error(message(\"symbolic:int:DifferentRealParts\")) end_if end_if; if ~hastype(integral, \"int\") && ~hastype(integral, \"limit\") then integral := intlib::Simplify(integral) end_if; integral := subs(integral, hold(intlib::frozenInt) = hold(int), Unsimplified); unevaluated_int := FALSE; if domtype(integral) ~= piecewise then misc::maprec(integral, {\"int\"} = (i -> (if op(i, [2, 1]) = op(DOM_VAR(1,13), 1) then DOM_VAR(1,7) := TRUE; misc::breakmap() end_if; i)), Unsimplified) end_if; if unevaluated_int && ~options[hold(AlwaysExtractIntegrableParts)] = TRUE && 3*intlib::Simplify::defaultValuation([f, x]) + 200 < intlib::Simplify::defaultValuation(integral) then return(hold(int)(f, x, intlib::printOptions(options, x))) end_if; return(integral) else error(message(\"symbolic:int:InvalidSecondArgument\")) end_if end_if end_proc'

Più risposte (0)

Categorie

Scopri di più su Symbolic Math Toolbox in Help Center e File Exchange

Prodotti


Release

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by