Theoretical details regarding symbolic integration in Matlab

조회 수: 5 (최근 30일)
Michael Loibl
Michael Loibl 2024년 8월 19일
답변: Walter Roberson 2024년 8월 19일
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

채택된 답변

Walter Roberson
Walter Roberson 2024년 8월 19일
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'

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Symbolic Math Toolbox에 대해 자세히 알아보기

제품


릴리스

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by