41 for (i = 0; i < ctx->
dim; ++i) {
51 size_t i, j, n = ctx->
dim;
63 for (i = 0; i < n; ++i) {
64 for (j = 0; j < n; ++j) {
65 jac_data[i * J->
stride + j] = -ctx->
h * jac_data[i * J->
stride + j];
67 jac_data[i * J->
stride + i] += 1.0;
78 const size_t dim = ctx->
dim;
80 while (t < t_end && out_result->num_steps < cfg->max_steps) {
83 if (rem <= 0.0) {
break; }
94 ctx, x_vec, opt_cfg, &opt_res);
135 size_t work_bytes = 0;
136 size_t total_work_bytes = 0;
146 cfg, &local_cfg, out_result, &work_bytes);
150 {
lmmc_real_t span = t_end - t_start;
if (h > span) h = span; }
158 if (!lmmc_safe_mul_size(work_bytes, 4, &total_work_bytes)) {
182 init_st = implicit_euler_integrate(&ctx, &x_vec, &opt_cfg, y,
183 t, h, t_end, &local_cfg, out_result);
214 for (i = 0; i < ctx->
dim; ++i) {
216 - 0.5 * ctx->
h * (ctx->
f_n[i] + F->
data[i]);
225 size_t i, j, n = ctx->
dim;
237 for (i = 0; i < n; ++i) {
238 for (j = 0; j < n; ++j) {
239 jac_data[i * J->
stride + j] *= -0.5 * ctx->
h;
241 jac_data[i * J->
stride + i] += 1.0;
252 const size_t dim = ctx->
dim;
254 while (t < t_end && out_result->num_steps < cfg->max_steps) {
257 if (rem <= 0.0) {
break; }
258 if (h > rem) h = rem;
278 ctx, x_vec, opt_cfg, &opt_res);
319 size_t work_bytes = 0;
320 size_t total_work_bytes = 0;
331 cfg, &local_cfg, out_result, &work_bytes);
335 {
lmmc_real_t span = t_end - t_start;
if (h > span) h = span; }
342 if (!lmmc_safe_mul_size(work_bytes, 5, &total_work_bytes)) {
368 init_st = trapezoidal_integrate(&ctx, &x_vec, &opt_cfg, y,
369 t, h, t_end, &local_cfg, out_result);
double lmmc_real_t
Public and internal LMMC real type.
稠密矩阵直接分解接口(LU、Cholesky、QR)。
void * lmmc_memory_alloc(size_t size)
void lmmc_memory_free(void *pointer)
Private recoverable allocator for persistent LMMC ownership.
常微分方程初值问题求解器:Euler、RK4、RK45(自适应)。
lmmc_status_t(*) lmmc_ode_rhs_t(lmmc_real_t t, const lmmc_real_t *y, lmmc_real_t *y_prime, size_t dim, void *user_data)
ODE 右端函数签名 。
lmmc_status_t lmmc_ode_implicit_euler_solve(lmmc_ode_rhs_t rhs, void *user_data, size_t dim, lmmc_real_t t_start, lmmc_real_t t_end, lmmc_real_t *y, const lmmc_ode_config_t *cfg, lmmc_ode_result_t *out_result)
隐式 Euler 法求解器(A-稳定,适用于刚性问题)。
@ LMMC_ODE_FAILURE_NUMERICAL_ISSUE
@ LMMC_ODE_FAILURE_RHS_EVAL_FAILED
@ LMMC_ODE_FAILURE_INVALID_DIMENSION
@ LMMC_ODE_FAILURE_MAX_STEPS
lmmc_status_t(*) lmmc_ode_jac_t(lmmc_real_t t, const lmmc_real_t *y, lmmc_real_t *J, size_t dim, void *user_data)
ODE Jacobian 回调签名 。
lmmc_status_t lmmc_ode_trapezoidal_solve(lmmc_ode_rhs_t rhs, void *user_data, size_t dim, lmmc_real_t t_start, lmmc_real_t t_end, lmmc_real_t *y, const lmmc_ode_config_t *cfg, lmmc_ode_result_t *out_result)
梯形法求解器(A-稳定,二阶精度)。
lmmc_ode_failure_t failure_reason
lmmc_real_t * jac_rhs_perturbed
lmmc_real_t * jac_y_perturbed
lmmc_real_t * jac_rhs_perturbed
lmmc_real_t * jac_base_rhs
lmmc_real_t * jac_base_rhs
lmmc_real_t * jac_y_perturbed
lmmc_status_t lmmc_ode_rhs_eval(lmmc_ode_rhs_t rhs, lmmc_real_t t, const lmmc_real_t *y, lmmc_real_t *y_prime, size_t dim, void *user_data, size_t *io_eval_count, int *out_callback_failed)
lmmc_status_t lmmc_ode_jacobian_eval(const lmmc_ode_jacobian_request_t *request)
lmmc_status_t validate_and_init_ode_config(lmmc_ode_rhs_t rhs, size_t dim, lmmc_real_t t_start, lmmc_real_t t_end, const lmmc_real_t *y, const lmmc_ode_config_t *cfg, lmmc_ode_config_t *out_cfg, lmmc_ode_result_t *out_result, size_t *out_work_bytes)
int lmmc_ode_state_is_finite(const lmmc_real_t *y, size_t dim)
void lmmc_ode_do_log(const lmmc_ode_config_t *cfg, size_t step, lmmc_real_t t, const lmmc_real_t *y, size_t dim)
lmmc_status_t lmmc_nleq_newton(lmmc_opt_func_t F, lmmc_opt_jac_t J, void *user_data, lmmc_vec_t *x, const lmmc_optimize_config_t *cfg, lmmc_optimize_result_t *out)
Newton 法求解非线性方程组 F(x) = 0。
lmmc_status_t lmmc_optimize_default_config(lmmc_optimize_config_t *cfg)
初始化默认优化配置。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_CONVERGENCE_FAILED
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT