8 const std::shared_ptr<const SymbolicNode>& node,
const std::string& var) {
10 if (
auto fn = std::dynamic_pointer_cast<const FunctionNode>(node)) {
17 if (std::dynamic_pointer_cast<const VariableNode>(node)) {
return 3; }
18 if (
const auto* power =
dynamic_cast<const PowerNode*
>(node.get())) {
20 const auto* base =
dynamic_cast<const VariableNode*
>(power->base().get());
21 if (base && base->name() == var &&
exponent &&
28 const std::vector<std::shared_ptr<const SymbolicNode>>& ops,
const std::string& var) {
31 if (ops.size() == 1) {
33 if (s <= 2) best_u_idx = 0;
35 for (
size_t i = 0; i < ops.size(); ++i) {
48 const std::vector<std::shared_ptr<const SymbolicNode>>& ops,
int best_u_idx) {
49 std::vector<std::shared_ptr<const SymbolicNode>> dv_ops;
50 for (
size_t i = 0; i < ops.size(); ++i) {
51 if ((
int)i != best_u_idx) {
52 dv_ops.push_back(ops[i]);
56 return SymbolicExpr::number(1);
58 if (dv_ops.size() == 1) {
65Result<std::optional<detail::IntegralParts>> Integrator::try_integration_by_parts(
66 const SymbolicExpr& expr,
const std::string& var,
67 ComputationContext& computation,
int depth)
try {
68 detail::RewriteBudget transform_budget(computation, (computation).limits().max_recursion_depth,
69 (computation).limits().max_ast_nodes,
"transform");
71 std::vector<std::shared_ptr<const SymbolicNode>> ops;
73 ops =
mul->operands();
78 if (best_u_idx == -1) {
return std::optional<detail::IntegralParts>{}; }
80 for (std::size_t i = 0; i < ops.size(); ++i) {
81 if (i ==
static_cast<std::size_t
>(best_u_idx) ||
87 return std::optional<detail::IntegralParts>{};
95 auto integrated_v = integrate_recursive(*dv, var, computation,
depth + 1);
99 if (!
detail::node(integrated_v.value().remainder)->is_zero()) {
100 return std::optional<detail::IntegralParts>{};
108 auto vdu = SymbolicExpr::multiply(
v, du);
110 auto integrated_vdu = integrate_recursive(*vdu, var, computation,
depth + 1);
111 if (!integrated_vdu) {
114 auto parts = std::move(integrated_vdu.value());
121 return std::optional<detail::IntegralParts>{{std::move(primitive), std::move(remainder)}};
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
int integration_by_parts_score(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
std::shared_ptr< SymbolicExpr > integration_differential_factor(const std::vector< std::shared_ptr< const SymbolicNode > > &ops, int best_u_idx)
int integration_by_parts_choice(const std::vector< std::shared_ptr< const SymbolicNode > > &ops, const std::string &var)
SymbolicNodePtr differentiate_node(const SymbolicNodePtr &node, const std::string &variable, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
inline ::LMCAS::SymbolicExpr expression_from_node(SymbolicNodePtr root)
std::shared_ptr< const Node > make_node(Args &&... args)
std::optional< Rational > exact_rational_value(const NumberNode &number)
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
ExprResult mul(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
bool expression_depends_on_variable(const detail::SymbolicNodePtr &expression, const std::string &variable, detail::RewriteBudget *budget)
bool depends_on_integration_variable(const SymbolicExpr &expression, const std::string &variable)
std::size_t std::size_t depth
std::shared_ptr< SymbolicExpr > sym_sub(const SymbolicExpr &lhs, const SymbolicExpr &rhs)
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u