LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
symbolic_matrix_transform.cpp
浏览该文件的文档.
1
#include "
internal/symbolic_matrix_support.hpp
"
2
3
#include <cmath>
4
#include <new>
5
6
namespace
LMCAS
{
7
using namespace
detail::matrix_api
;
8
namespace
{
9
ExpressionResult
unsupported_matrix_dimension
(
const
std::string& operation)
10
{
11
return
ExpressionResult::failure
(
12
CasErrc::UnsupportedExpression
,
13
"only two-dimensional transformation matrices are supported"
, operation);
14
}
15
16
ExpressionResult
invalid_matrix_dimension
(
const
std::string& operation)
17
{
18
return
ExpressionResult::failure
(
19
CasErrc::DimensionMismatch
,
20
"only two-dimensional transformation matrices are supported"
, operation);
21
}
22
}
23
24
ExpressionResult
matrix_rotation_checked
(
double
theta,
int
dim
,
25
ComputationContext
&
context
) {
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)) {
31
return
ExpressionResult::failure
(
32
CasErrc::InvalidArgument
,
33
"rotation angle must be finite"
, operation);
34
}
35
auto
c
= SymbolicExpr::number(std::cos(theta));
36
auto
s = SymbolicExpr::number(std::sin(theta));
37
return
require_matrix_result
(
38
SymbolicExpr::matrix(
39
{{
c
, SymbolicExpr::multiply(SymbolicExpr::number(-1), s)},
40
{s,
c
}}),
41
operation);
42
}
43
44
ExpressionResult
matrix_rotation_checked
(
double
theta,
int
dim
) {
45
ComputationContext
context
;
46
return
matrix_rotation_checked
(theta,
dim
,
context
);
47
}
48
49
50
ExpressionResult
matrix_reflection_checked
(
double
angle,
int
dim
,
51
ComputationContext
&
context
) {
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)) {
57
return
ExpressionResult::failure
(
CasErrc::InvalidArgument
,
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);
65
return
require_matrix_result
(
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&) {
71
return
ExpressionResult::failure
(
CasErrc::ResourceLimit
,
72
"allocation failed while constructing reflection matrix"
, operation);
73
}
catch
(
const
std::exception& error) {
74
return
ExpressionResult::failure
(
CasErrc::InternalInvariant
,
75
error.what(), operation);
76
}
77
}
78
return
unsupported_matrix_dimension(operation);
79
}
80
81
ExpressionResult
matrix_reflection_checked
(
double
angle,
int
dim
) {
82
ComputationContext
context
;
83
return
matrix_reflection_checked
(angle,
dim
,
context
);
84
}
85
86
87
ExpressionResult
matrix_scaling_checked
(
double
sx,
double
sy
,
int
dim
,
88
ComputationContext
&
context
) {
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
)) {
94
return
ExpressionResult::failure
(
95
CasErrc::InvalidArgument
,
96
"scaling factors must be finite"
, operation);
97
}
98
return
require_matrix_result
(
99
SymbolicExpr::matrix(
100
{{SymbolicExpr::number(sx), SymbolicExpr::number(0)},
101
{SymbolicExpr::number(0), SymbolicExpr::number(
sy
)}}),
102
operation);
103
}
104
105
ExpressionResult
matrix_scaling_checked
(
double
sx,
double
sy
,
int
dim
) {
106
ComputationContext
context
;
107
return
matrix_scaling_checked
(sx,
sy
,
dim
,
context
);
108
}
109
110
}
LMCAS::ComputationContext
定义
computation_context.hpp:99
LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure
static Result failure(CasErrc code, std::string message, std::string operation={})
定义
result.hpp:52
LMCAS::anonymous_namespace{symbolic_matrix_transform.cpp}::invalid_matrix_dimension
ExpressionResult invalid_matrix_dimension(const std::string &operation)
定义
symbolic_matrix_transform.cpp:16
LMCAS::anonymous_namespace{symbolic_matrix_transform.cpp}::unsupported_matrix_dimension
ExpressionResult unsupported_matrix_dimension(const std::string &operation)
定义
symbolic_matrix_transform.cpp:9
LMCAS::detail::matrix_api
定义
symbolic_matrix_support.hpp:8
LMCAS::detail::matrix_api::require_matrix_result
ExpressionResult require_matrix_result(std::shared_ptr< SymbolicExpr > result, const std::string &operation)
定义
symbolic_matrix_support.cpp:38
LMCAS
定义
assumption.hpp:11
LMCAS::sy
double sy
定义
symbolic_matrix.hpp:167
LMCAS::context
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
定义
exact_factorization.hpp:65
LMCAS::c
const VectorField const VectorField & c
定义
vector_calculus_vectors.hpp:60
LMCAS::matrix_scaling_checked
ExpressionResult matrix_scaling_checked(double sx, double sy, int dim, ComputationContext &context)
定义
symbolic_matrix_transform.cpp:87
LMCAS::CasErrc::InvalidArgument
@ InvalidArgument
定义
result.hpp:13
LMCAS::CasErrc::DimensionMismatch
@ DimensionMismatch
定义
result.hpp:17
LMCAS::CasErrc::UnsupportedExpression
@ UnsupportedExpression
定义
result.hpp:23
LMCAS::CasErrc::InternalInvariant
@ InternalInvariant
定义
result.hpp:28
LMCAS::CasErrc::ResourceLimit
@ ResourceLimit
定义
result.hpp:25
LMCAS::ExpressionResult
Result< std::shared_ptr< SymbolicExpr > > ExpressionResult
Result of an operation that produces a symbolic expression.
定义
symbolic.hpp:31
LMCAS::dim
__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
定义
symbolic_matrix.hpp:130
LMCAS::matrix_rotation_checked
ExpressionResult matrix_rotation_checked(double theta, int dim, ComputationContext &context)
定义
symbolic_matrix_transform.cpp:24
LMCAS::matrix_reflection_checked
ExpressionResult matrix_reflection_checked(double angle, int dim, ComputationContext &context)
定义
symbolic_matrix_transform.cpp:50
LMCAS::CasError
定义
result.hpp:31
symbolic_matrix_support.hpp
src
symbolic_matrix_transform.cpp
生成于
, 为 LMCAS使用
1.18.0