LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
symbolic_matrix_transform.cpp
浏览该文件的文档.
2
3#include <cmath>
4#include <new>
5
6namespace LMCAS {
7using namespace detail::matrix_api;
8namespace {
9ExpressionResult unsupported_matrix_dimension(const std::string& operation)
10{
13 "only two-dimensional transformation matrices are supported", operation);
14}
15
16ExpressionResult invalid_matrix_dimension(const std::string& operation)
17{
20 "only two-dimensional transformation matrices are supported", operation);
21}
22}
23
26 const std::string operation = "matrix_rotation";
27 auto step = context.consume_steps(1, operation);
28 if (!step) return ExpressionResult::failure(step.error());
29 if (dim != 2) return invalid_matrix_dimension(operation);
30 if (!std::isfinite(theta)) {
33 "rotation angle must be finite", operation);
34 }
35 auto c = SymbolicExpr::number(std::cos(theta));
36 auto s = SymbolicExpr::number(std::sin(theta));
38 SymbolicExpr::matrix(
39 {{c, SymbolicExpr::multiply(SymbolicExpr::number(-1), s)},
40 {s, c}}),
41 operation);
42}
43
48
49
52 const std::string operation = "matrix_reflection";
53 auto step = context.consume_steps(1, operation);
54 if (!step) return ExpressionResult::failure(step.error());
55 if (dim == 2) {
56 if (!std::isfinite(angle)) {
58 "reflection angle must be finite", operation);
59 }
60 const double cosine = std::cos(angle);
61 const double sine = std::sin(angle);
62 try {
63 auto c = SymbolicExpr::number(cosine * cosine - sine * sine);
64 auto s = SymbolicExpr::number(2.0 * sine * cosine);
66 SymbolicExpr::matrix({{c, s}, {s, SymbolicExpr::multiply(SymbolicExpr::number(-1), c)}}),
67 operation);
68 } catch (const CasError& error) {
69 return ExpressionResult::failure(error);
70 } catch (const std::bad_alloc&) {
72 "allocation failed while constructing reflection matrix", operation);
73 } catch (const std::exception& error) {
75 error.what(), operation);
76 }
77 }
78 return unsupported_matrix_dimension(operation);
79}
80
85
86
89 const std::string operation = "matrix_scaling";
90 auto step = context.consume_steps(1, operation);
91 if (!step) return ExpressionResult::failure(step.error());
92 if (dim != 2) return invalid_matrix_dimension(operation);
93 if (!std::isfinite(sx) || !std::isfinite(sy)) {
96 "scaling factors must be finite", operation);
97 }
99 SymbolicExpr::matrix(
100 {{SymbolicExpr::number(sx), SymbolicExpr::number(0)},
101 {SymbolicExpr::number(0), SymbolicExpr::number(sy)}}),
102 operation);
103}
104
109
110}
static Result failure(CasErrc code, std::string message, std::string operation={})
ExpressionResult invalid_matrix_dimension(const std::string &operation)
ExpressionResult unsupported_matrix_dimension(const std::string &operation)
ExpressionResult require_matrix_result(std::shared_ptr< SymbolicExpr > result, const std::string &operation)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
const VectorField const VectorField & c
ExpressionResult matrix_scaling_checked(double sx, double sy, int dim, ComputationContext &context)
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
__attribute__((visibility("default"))) MatrixRankResult matrix_rank_checked(const std __attribute__((visibility("default"))) MatrixRankResult matrix_rank_checked(const std __attribute__((visibility("default"))) ExpressionResult matrix_rref_checked(const std __attribute__((visibility("default"))) ExpressionResult matrix_rref_checked(const std __attribute__((visibility("default"))) MatrixNullspaceResult matrix_nullspace_checked(const std __attribute__((visibility("default"))) MatrixNullspaceResult matrix_nullspace_checked(const std __attribute__((visibility("default"))) MatrixLinearSolveResult matrix_solve_linear_checked(const std __attribute__((visibility("default"))) MatrixLinearSolveResult matrix_solve_linear_checked(const std int dim
ExpressionResult matrix_rotation_checked(double theta, int dim, ComputationContext &context)
ExpressionResult matrix_reflection_checked(double angle, int dim, ComputationContext &context)