39 n.
left()->accept(*
this);
42 n.
right()->accept(*
this);
50 n.
left()->accept(*
this);
53 n.
right()->accept(*
this);
57 for (
const auto& branch : n.
branches()) {
61 branch.expression->accept(*
this);
63 branch.condition->accept(*
this);
71 n.
body()->accept(*
this);
80 n.
body()->accept(*
this);
89 n.
body()->accept(*
this);
104 n.
real()->accept(*
this);
106 n.
imag()->accept(*
this);
111 }
e->accept(*
this); } }
113 n.
upper()->accept(*
this);
116 n.
set()->accept(*
this);
142 n.
base()->accept(*
this);
170static BigInt degree_in_var(
171 const std::shared_ptr<const SymbolicNode>& node,
const std::string& var);
175 for (
const auto& operand : sum.
operands()) {
180 if (degree > maximum) {
181 maximum = std::move(degree);
189 for (
const auto& operand : product.
operands()) {
207static BigInt
degree_in_var(
const std::shared_ptr<const SymbolicNode>& node,
const std::string& var) {
216 if (
auto v = std::dynamic_pointer_cast<const VariableNode>(node)) {
217 return (!
v->is_constant() &&
v->name() == var) ? 1 : 0;
220 if (
auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
224 if (
auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
228 if (
auto pow = std::dynamic_pointer_cast<const PowerNode>(node)) {
229 auto exp_num = std::dynamic_pointer_cast<const NumberNode>(
pow->exponent());
239 return base_deg * e_val;
241 if (std::dynamic_pointer_cast<const FunctionNode>(node)) {
251 const std::shared_ptr<SymbolicExpr>& expr,
252 const std::string& var)
257 TranscendentalDetector detector(var);
259 return detector.found;
274 for (
const auto& m : sub_result.
mappings) {
276 degree_in_var(root, m.indeterminate).is_negative()) {
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept
const std::shared_ptr< const SymbolicNode > & real() const noexcept
const std::shared_ptr< const SymbolicNode > & imag() const noexcept
const std::vector< std::shared_ptr< const SymbolicNode > > & elements() const noexcept
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
FuncType type() const noexcept
const std::vector< std::shared_ptr< const SymbolicNode > > & arguments() const noexcept
const auto & lower() const noexcept
const auto & upper() const noexcept
const std::shared_ptr< const SymbolicNode > & right() const noexcept
const std::shared_ptr< const SymbolicNode > & left() const noexcept
const auto & set() const noexcept
const auto & element() const noexcept
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept
const std::shared_ptr< const SymbolicNode > & default_expr() const noexcept
const std::vector< Branch > & branches() const noexcept
const std::shared_ptr< const SymbolicNode > & exponent() const noexcept
const std::shared_ptr< const SymbolicNode > & base() const noexcept
连乘节点,表示符号有限/无限连乘 prod_{k=a}^{b} f(k).
const std::shared_ptr< const SymbolicNode > & lower_bound() const noexcept
const std::shared_ptr< const SymbolicNode > & upper_bound() const noexcept
const std::shared_ptr< const SymbolicNode > & body() const noexcept
const std::shared_ptr< const SymbolicNode > & predicate() const noexcept
const std::shared_ptr< const SymbolicNode > & domain() const noexcept
const auto & value() const noexcept
const std::shared_ptr< const SymbolicNode > & right() const noexcept
const std::shared_ptr< const SymbolicNode > & left() const noexcept
const std::shared_ptr< const SymbolicNode > & domain() const noexcept
const std::shared_ptr< const SymbolicNode > & predicate() const noexcept
求和节点,表示符号有限/无限求和 sum_{k=a}^{b} f(k).
const std::shared_ptr< const SymbolicNode > & lower_bound() const noexcept
const std::shared_ptr< const SymbolicNode > & body() const noexcept
const std::shared_ptr< const SymbolicNode > & upper_bound() const noexcept
virtual void accept(LMCAS::detail::SymbolicVisitor &visitor) const =0
static BigInt degree_in_var(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
计算节点关于指定变量的多项式次数。 与 var 无关的子表达式次数为 0。
static BigInt product_degree(const MultiplyNode &product, const std::string &var)
static BigInt sum_degree(const AddNode &sum, const std::string &var)
static bool is_transcendental_func(FunctionNode::FuncType t)
判断函数类型是否为 sin、cos、tan、exp 或 ln。
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
ExprResult pow(const ExprPtr &base, const ExprPtr &exponent, ComputationContext &context)
__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
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
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)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
std::shared_ptr< SymbolicExpr > poly_expr
换元后的多项式表达式
const ExprPtr RelationOp op
std::vector< TransSubstitution > mappings
所有换元映射
__attribute__((visibility("default"))) MixedTranscendentalResult solve_mixed_transcendental_checked(const std __attribute__((visibility("default"))) MixedTranscendentalResult solve_mixed_transcendental_checked(const std __attribute__((visibility("default"))) bool contains_transcendental_of_var(const std bool is_polynomial_after_substitution(const TransSubstitutionResult &sub_result)
在调用方计算上下文中执行混合超越方程求解.
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t
bool contains_transcendental_of_var(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var)
混合超越方程求解:符号预处理 + 自适应根隔离 + Newton-Raphson 精化.
void visit(const SummationNode &n) override
void visit(const TransformNode &n) override
void visit(const QuantifierNode &n) override
void visit(const IntervalNode &n) override
void visit(const SetBuilderNode &n) override
void visit(const FunctionNode &n) override
void visit(const NumberNode &) override
void visit(const MatrixNode &) override
TranscendentalDetector(const std::string &v)
void visit(const AddNode &n) override
const std::string & target_var
void visit(const QuantityNode &n) override
void visit(const MultiplyNode &n) override
void visit(const LogicalNode &n) override
void visit(const PiecewiseNode &n) override
void visit(const FiniteSetNode &n) override
void visit(const RelationalNode &n) override
void visit(const PowerNode &n) override
void visit(const ProductNode &n) override
void visit(const ComplexNode &n) override
void visit(const VariableNode &) override
void visit(const MembershipNode &n) override