10 auto num = std::dynamic_pointer_cast<const NumberNode>(node);
12 return std::numeric_limits<lmmc_real_t>::quiet_NaN();
15 if (std::holds_alternative<Rational>(
num->value())) {
16 return static_cast<lmmc_real_t
>(std::get<Rational>(
num->value()).to_double());
18 if (std::holds_alternative<BigInt>(
num->value())) {
19 return static_cast<lmmc_real_t
>(std::get<BigInt>(
num->value()).to_double());
21 return std::numeric_limits<lmmc_real_t>::quiet_NaN();
27 if (product.
operands().size() != 2) {
28 return std::numeric_limits<lmmc_real_t>::quiet_NaN();
30 std::shared_ptr<const SymbolicNode> number;
31 bool has_variable =
false;
32 for (
const auto& operand : product.
operands()) {
33 if (operand->is_number()) {
35 }
else if (
auto variable = std::dynamic_pointer_cast<const VariableNode>(operand)) {
41 if (number && has_variable) {
44 return std::numeric_limits<lmmc_real_t>::quiet_NaN();
48 const std::shared_ptr<const SymbolicNode>& node,
49 const std::string& var)
55 if (
auto v = std::dynamic_pointer_cast<const VariableNode>(node)) {
56 if (!
v->is_constant() &&
v->name() == var) {
59 return std::numeric_limits<lmmc_real_t>::quiet_NaN();
62 if (
auto mul = std::dynamic_pointer_cast<const MultiplyNode>(node)) {
66 if (
auto add = std::dynamic_pointer_cast<const AddNode>(node)) {
67 lmmc_real_t coeff = std::numeric_limits<lmmc_real_t>::quiet_NaN();
68 bool found_var_term =
false;
70 for (
const auto&
op :
add->operands()) {
75 return std::numeric_limits<lmmc_real_t>::quiet_NaN();
77 found_var_term =
true;
81 return found_var_term ? coeff : std::numeric_limits<lmmc_real_t>::quiet_NaN();
84 return std::numeric_limits<lmmc_real_t>::quiet_NaN();
123 if (std::isnan(k) || k == 0.0) {
128 ? LMMC_CONST_PI / std::fabs(k)
129 : 2.0 * LMMC_CONST_PI / std::fabs(k);
144 const std::shared_ptr<SymbolicExpr>& expr,
145 const std::string& var,
158 lmmc_real_t lo = -10.0;
159 lmmc_real_t hi = 10.0;
162 PeriodicCollector collector(var);
165 if (collector.found_periodic && !collector.has_nonlinear_periodic && collector.max_period > 0.0) {
167 lmmc_real_t half_span = collector.max_period;
168 if (half_span > lo * -1.0 || half_span > hi) {
函数节点,表示数学函数调用(三角函数、对数、特殊函数等)。
FuncType type() const noexcept
const std::vector< std::shared_ptr< const SymbolicNode > > & arguments() const noexcept
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept
virtual void accept(LMCAS::detail::SymbolicVisitor &visitor) const =0
void visit(const NumberNode &) override
virtual void visit_child(const SymbolicNodePtr &child)
static lmmc_real_t extract_real_value(const std::shared_ptr< const SymbolicNode > &node)
static lmmc_real_t extract_linear_coefficient(const std::shared_ptr< const SymbolicNode > &node, const std::string &var)
static lmmc_real_t product_linear_coefficient(const MultiplyNode &product, const std::string &var)
static bool is_periodic_func(FunctionNode::FuncType t)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< SymbolicExpr > num(int value)
const std::string & variable
__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 has_search_interval
是否指定了搜索区间
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::optional< SearchInterval > determine_search_interval(const std::shared_ptr< SymbolicExpr > &expr, const std::string &var, const SolveOptions &opts)
lmmc_real_t tolerance
收敛容差
const ExprPtr RelationOp op
lmmc_real_t search_lo
搜索区间下界(默认 -10)
lmmc_real_t search_hi
搜索区间上界(默认 10)
__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
混合超越方程求解:符号预处理 + 自适应根隔离 + Newton-Raphson 精化.
bool has_nonlinear_periodic
const std::string & target_var
PeriodicCollector(const std::string &v)
void visit(const TransformNode &node) override
void visit(const FunctionNode &node) override
void visit(const MatrixNode &) override
void collect_period(const FunctionNode &n)