11 const std::shared_ptr<SymbolicExpr>& F,
const std::string& s,
const std::string&
t) {
18 auto symbol = std::dynamic_pointer_cast<const VariableNode>(addition.
operands()[i]);
19 if (!symbol || symbol->is_constant() || symbol->name() !=
variable)
return nullptr;
25 const std::shared_ptr<const SymbolicNode>& base,
const std::string&
variable) {
26 auto addition = std::dynamic_pointer_cast<const AddNode>(base);
27 if (!addition || addition->operands().size() != 2)
return nullptr;
29 if (pole)
return pole;
34 const std::shared_ptr<SymbolicExpr>& F,
const std::string& s,
39 auto tv = SymbolicExpr::variable(
t);
50 auto make_exp = [&](
const std::shared_ptr<SymbolicExpr>&
a) {
51 auto arg = SymbolicExpr::multiply(
a, tv);
56 auto bv = std::dynamic_pointer_cast<const VariableNode>(pw->base());
57 if (bv && !bv->is_constant() && bv->name() == s) {
59 return SymbolicExpr::number(1);
61 return SymbolicExpr::divide(SymbolicExpr::power(tv, SymbolicExpr::number(n - BigInt(1))),
68 return SymbolicExpr::number(1);
70 return make_exp(pole);
72 auto tp = SymbolicExpr::power(tv, SymbolicExpr::number(n - BigInt(1)));
75 return SymbolicExpr::divide(tp, fv);
77 return SymbolicExpr::divide(SymbolicExpr::multiply(tp, make_exp(pole)), fv);
82 const std::shared_ptr<const SymbolicNode>& expression,
84 const auto power = std::dynamic_pointer_cast<const PowerNode>(expression);
85 if (!power)
return false;
92 const std::shared_ptr<SymbolicExpr>& F,
const std::string& s,
98 if (!
mul ||
mul->operands().size() < 2) {
101 std::vector<std::shared_ptr<const SymbolicNode>> num_parts;
102 std::shared_ptr<const SymbolicNode> den_part =
nullptr;
103 for (
const auto&
op :
mul->operands()) {
108 num_parts.push_back(
op);
113 std::shared_ptr<SymbolicExpr> num_expr;
114 if (num_parts.empty()) {
115 num_expr = SymbolicExpr::number(1);
116 }
else if (num_parts.size() == 1) {
124 return SymbolicExpr::multiply(num_expr, inv);
131 const std::shared_ptr<SymbolicExpr>& F,
const std::string& s,
133 auto step =
context.consume_steps(1,
"inverse_laplace.recursive");
141 return SymbolicExpr::number(0);
145 std::shared_ptr<SymbolicExpr> result;
146 for (
auto&
op :
add->operands()) {
152 result = result ? SymbolicExpr::add(result, ilt) : ilt;
157 if (!coeff->is_one()) {
160 return SymbolicExpr::multiply(coeff, ilt_body);
175 const std::shared_ptr<SymbolicExpr>& F,
176 const std::string& s,
177 const std::string&
t,
179 const std::string operation =
"inverse_laplace";
182 auto step =
context.consume_steps(8, operation);
186 auto final_access =
context.consume_steps(0, operation);
191 if (!result)
return result;
198 "inverse Laplace round trip is not proved", operation);
202 if (!std::holds_alternative<ProvedZeroResidual>(verified.value())) {
205 "inverse Laplace round trip is not proved", operation);
207 result.value().certificate =
212 }
catch (
const std::bad_alloc&) {
214 "transform allocation failed",
216 }
catch (
const std::exception&
e) {
218 e.what(), operation);
223 const std::shared_ptr<SymbolicExpr>& F,
224 const std::string& s,
225 const std::string&
t) {
const std::vector< std::shared_ptr< const SymbolicNode > > & operands() const noexcept
static Result failure(CasErrc code, std::string message, std::string operation={})
static std::shared_ptr< const SymbolicNode > create_variable(const std::string &name)
static std::shared_ptr< const SymbolicNode > create_multiply(std::vector< std::shared_ptr< const SymbolicNode > > ops, detail::RewriteBudget *budget=nullptr)
创建乘法节点,自动扁平化嵌套乘法并消除单位元.
static std::shared_ptr< const SymbolicNode > create_number(const ::LMCAS::BigInt &v)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
std::shared_ptr< const Node > make_node(Args &&... args)
const std::string & variable
static std::shared_ptr< SymbolicExpr > te_unevaluated_inv_laplace(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
ResidualCheckResult check_equivalent(const ExprPtr &left, const ExprPtr &right, ComputationContext &context, const LMCAS::EqvOptions &options)
bool try_get_integer_value(const std::shared_ptr< const NumberNode > &node, BigInt &value)
static std::shared_ptr< SymbolicExpr > inverse_laplace_core(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_inverse_pole_term(const AddNode &addition, std::size_t i, const std::string &variable)
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)
static bool te_is_denominator_factor(const std::shared_ptr< const SymbolicNode > &expression, const std::string &variable)
ExprResult add(const ExprPtr &lhs, const ExprPtr &rhs, ComputationContext &context)
const ExprPtr RelationOp op
__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 const std::shared_ptr< SymbolicExpr > & a
Result< Verified< EvaluatedTransform > > TransformEngineResult
static std::shared_ptr< SymbolicExpr > te_inverse_pole(const std::shared_ptr< const SymbolicNode > &base, const std::string &variable)
TransformEngineResult inverse_laplace_checked(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)
__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
static std::shared_ptr< SymbolicExpr > te_inv_product(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)
static std::shared_ptr< SymbolicExpr > te_inv_power(const std::shared_ptr< SymbolicExpr > &F, const std::string &s, const std::string &t, ComputationContext &context)