# lsqlin
求解约束线性最小二乘问题
函数库: TyOptimization
# 语法
x,resnorm,residual,exitflag,output,lambda = lsqlin(C,d,A,b)
_ = lsqlin(C,d,A,b,Aeq,beq,lb,ub)
_ = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options)
_ = lsqlin(problem)
wsout,resnorm,residual,exitflag,output,lambda = lsqlin(C,d,A,b,Aeq,beq,lb,ub,ws)
# 说明
具有边界或线性约束的线性最小二乘求解器。
求解以下形式的最小二乘曲线拟合问题:
提示
lsqlin 仅适用于基于求解器的方法。有关这两种优化方法的讨论,请参见首先选择基于问题或基于求解器的方法。
x,resnorm,residual,exitflag,output,lambda = lsqlin(C,d,A,b) 在满足 A*x ≤ b 的情况下基于最小二乘思想求解线性方程组 C*x = d。lsqlin 返回值为示例
- 线性方程组的最小二乘解 x
- 残差的 2-范数平方 resnorm
- 残差 residual = C*x - d
- 描述退出条件的值 exitflag
- 包含有关优化过程信息的结构体 output
- 包含拉格朗日乘数的结构体 lambda
问题定义中的因子 ½ 会影响 lambda 结构体中的值。
_ = lsqlin(C,d,A,b,Aeq,beq,lb,ub) 增加线性等式约束 Aeq*x = beq 和边界 lb ≤ x ≤ ub。如果您不需要某些约束,如 Aeq 和 beq,请将其设置为 []。如果 x[i] 无下界,请设置 lb[i] = -Inf,如果 x[i] 无上界,请设置 ub[i] = Inf。示例
_ = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options) 使用初始点 x0 和 options 所指定的优化选项执行最小化。使用 optimoptions 可设置这些选项。如果您不想包含初始点,请将 x0 参数设置为 []。示例
_ = lsqlin(problem) 求 problem 的最小值,它是 problem 中所述的一个结构体。
wsout,resnorm,residual,exitflag,output,lambda = lsqlin(C,d,A,b,Aeq,beq,lb,ub,ws) 使用 ws 中的选项,从热启动对象 ws 中的数据启动 lsqlin。返回的参数 wsout 包含 wsout.X 中的解点。通过在后续求解器调用中使用 wsout 作为初始热启动对象,lsqlin 可以提高运行速度。示例
# 示例
具有线性不等式约束的最小二乘
对于具有线性不等式约束的超定问题,求使 C*x - d 的范数最小的 x。
指定问题和约束。
using TyOptimization
C = [0.9501 0.7620 0.6153 0.4057
0.2311 0.4564 0.7919 0.9354
0.6068 0.0185 0.9218 0.9169
0.4859 0.8214 0.7382 0.4102
0.8912 0.4447 0.1762 0.8936]
d = [0.0578
0.3528
0.8131
0.0098
0.1388]
A = [0.2027 0.2721 0.7467 0.4659
0.1987 0.1988 0.4450 0.4186
0.6037 0.0152 0.9318 0.8462]
b = [0.5251
0.2026
0.6721]
调用 lsqlin 以求解问题。
x, = lsqlin(C,d,A,b)
Minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 4-element Vector{Float64}:
0.12986197878982284
-0.5756944152447668
0.4251035072810173
0.24384475352381535
具有线性约束和边界的最小二乘
对于具有线性等式和不等式约束和边界的超定问题,求使 C*x - d 的范数最小的 x。
指定问题和约束。
using TyOptimization
C = [0.9501 0.7620 0.6153 0.4057
0.2311 0.4564 0.7919 0.9354
0.6068 0.0185 0.9218 0.9169
0.4859 0.8214 0.7382 0.4102
0.8912 0.4447 0.1762 0.8936]
d = [0.0578
0.3528
0.8131
0.0098
0.1388]
A =[0.2027 0.2721 0.7467 0.4659
0.1987 0.1988 0.4450 0.4186
0.6037 0.0152 0.9318 0.8462]
b =[0.5251
0.2026
0.6721]
Aeq = [3 5 7 9]
beq = [4]
lb = fill(-0.1,4)
ub = fill(2,4)
调用 lsqlin 以求解问题。
x, = lsqlin(C,d,A,b,Aeq,beq,lb,ub)
Minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 4-element Vector{Float64}:
-0.1
-0.1
0.15990882024562655
0.4089598064756239
使用非默认选项的线性最小二乘
此示例说明如何使用非默认选项执行线性最小二乘优化。
设置选项以使用 "interior-point" 算法并提供迭代输出。
using TyOptimization
options = optimoptions(:lsqlin,Algorithm="interior-point",Display="iter")
建立线性最小二乘问题。
C = [0.9501 0.7620 0.6153 0.4057
0.2311 0.4564 0.7919 0.9354
0.6068 0.0185 0.9218 0.9169
0.4859 0.8214 0.7382 0.4102
0.8912 0.4447 0.1762 0.8936]
d = [0.0578
0.3528
0.8131
0.0098
0.1388]
A = [0.2027 0.2721 0.7467 0.4659
0.1987 0.1988 0.4450 0.4186
0.6037 0.0152 0.9318 0.8462];
b = [0.5251
0.2026
0.6721]
运行问题。
x, = lsqlin(C,d,A,b,[],[],[],[],[],options)
Iter Resnorm Primal Infeas Dual Infeas Complementarity
0 2.525581e+01 1.241109e+01 1.299796e+01 7.962724e+00
1 3.183567e+00 6.205545e-04 6.498978e-04 1.140730e+00
2 4.783050e-01 3.102772e-08 3.249489e-08 1.627710e-01
3 8.400551e-02 1.551509e-12 1.624922e-12 2.227020e-02
4 2.558864e-02 0.000000e+00 2.220446e-16 2.426307e-03
5 1.840046e-02 0.000000e+00 2.220446e-16 2.789769e-04
6 1.761393e-02 1.387779e-16 2.220446e-16 1.441483e-05
7 1.758541e-02 1.110223e-16 2.220446e-16 1.235881e-08
8 1.758538e-02 0.000000e+00 2.220446e-16 6.179380e-13
Minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance and constraints are satisfied to within the value of the constraint tolerance.
x = 4-element Vector{Float64}:
0.129861978817916
-0.575694415265173
0.42510350727803664
0.24384475350739496
返回所有输出
获取并解释所有 lsqlin 输出。
定义具有线性不等式约束和边界的问题。问题是超定的,因为 C 矩阵中有四列,但有五行。这意味着问题有四个未知数和五个条件,而这还不包括线性约束和边界。
using TyOptimization
C = [0.9501 0.7620 0.6153 0.4057
0.2311 0.4564 0.7919 0.9354
0.6068 0.0185 0.9218 0.9169
0.4859 0.8214 0.7382 0.4102
0.8912 0.4447 0.1762 0.8936]
d = [0.0578
0.3528
0.8131
0.0098
0.1388]
A = [0.2027 0.2721 0.7467 0.4659
0.1987 0.1988 0.4450 0.4186
0.6037 0.0152 0.9318 0.8462]
b = [0.5251
0.2026
0.6721]
lb = fill(-0.1,4)
ub = fill(2,4)
带所有输出调用 lsqlin
x,resnorm,residual,exitflag,output,lambda = lsqlin(C,d,A,b,[],[],lb,ub)
Minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 4-element Vector{Float64}:
-0.1
-0.1
0.21522797283794953
0.35015182056166405
resnorm = 0.16716126486971777
residual = 5-element Vector{Float64}:
0.045476365289057456
0.07642104464375277
-0.3561786503649884
0.16198356634336894
0.07842883566794964
exitflag = 1
output = (cgiterations = -1, linearsolver = "", algorithm = "active-set", firstorderopt = 1.3877787807814457e-17, constrviolation = 1.1102230246251565e-16, iterations = 11, message = "\nMinimum found that satisfies the constraints.\n\nOptimization completed because the objective function is non-decreasing in \nfeasible directions, to within the value of the optimality tolerance,\nand constraints are satisfied to within the value of the constraint tolerance.\n\n\nOptimization completed: The relative dual feasibility, 1.5799072128795869e-18,\nis less than options.OptimalityTolerance = 1.0e-8 and the relative maximum constraint\nviolation, 4.6319121558060683e-17, is less than options.ConstraintTolerance = 1.0e-8.\n\n")
lambda = (lower = [0.040865450790403546, 0.2784198362226653, 0.0, 0.0], upper = [0.0, 0.0, 0.0, 0.0], eqlin = Float64[], ineqlin = [0.0, 0.23916992712659224, 0.0])
更详细地检查非零拉格朗日乘数字段。首先检查线性不等式约束的拉格朗日乘数。
lambda.ineqlin
ans = 3-element Vector{Float64}:
0.0
0.23916992712659224
0.0
当解位于对应的约束边界上时,拉格朗日乘数为非零值。换句话说,当对应的约束处于活动状态时,拉格朗日乘数为非零值。lambda.ineqlin[2] 为非零值。这意味着 A*x 中的第二个元素应等于 b 中的第二个元素,因为约束处于活动状态。
using TyMath
[dot(A[2,:],x),b[2]]
ans = 2-element Vector{Float64}:
0.20260000000000014
0.2026
现在检查下界和上界约束的拉格朗日乘数。
lambda.lower
ans = 4-element Vector{Float64}:
0.040865450790403546
0.2784198362226653
0.0
0.0
lambda.upper
ans = 4-element Vector{Float64}:
0.0
0.0
0.0
0.0
lambda.lower 的前两个元素为非零值。您会看到 x[1] 和 x[2] 位于其下界 -0.1 上。lambda.upper 的所有元素实质上为零,您会看到 x 的所有分量都小于其上界 2。
返回热启动对象
创建一个热启动对象,以便您可以快速求解修改后的问题。设置选项以关闭迭代输出来支持热启动。
using TyOptimization
using TyMath
rng=MT19937ar(5489) # 为了可复现
options = optimoptions(:lsqlin,Algorithm="active-set",Display="off")
n = 15
x0 = 5*rand(rng,n)
ws = optimwarmstart(x0,options)
创建并求解第一个问题。
v = Vector{Float64}(undef, n)
r = 1:(n - 1)
v[n] = (-1)^(n + 1) / n
v[r] = (-1) .^ (r .+ 1) ./ r
C = TestArrays.circul(v)
C = vcat(C, C)
r = 1:(2 * n)
d = zeros(r)
d[r] = n .- r
lb = fill(-5, n)
ub = fill(5, n)
@time begin
ws,fval,_,exitflag,output = lsqlin(C, d, [], [], [], [], lb, ub, ws)
end
0.000271 seconds (785 allocations: 126.047 KiB)
添加一个线性约束并再次求解。
A = ones(1,n)
b = [-10]
@time begin
ws,fval,_,exitflag,output = lsqlin(C,d,A,b,[],[],lb,ub,ws)
end
0.000258 seconds (1.09 k allocations: 144.562 KiB)
# 输入参数
C — 乘数矩阵实矩阵
乘数矩阵,指定为由双精度值组成的矩阵。C 表示 C*x - d 表达式中解 x 的乘数。C 的大小为 M×N,其中 M 是方程的数目,N 是 x 的元素数。
示例: C = [1 4;2 5;7 8]
d — 常向量实数向量
常向量,指定为由双精度值组成的向量。d 表示表达式 C*x - d 中的附加常数项。d 的大小为 M×1,其中 M 是方程的数目。
示例: d = [5;0;-12]
A — 线性不等式约束实矩阵
线性不等式约束,指定为实矩阵。A 是 M×N 矩阵,其中 M 是不等式的数目,而 N 是变量的数目(x0 中的元素数)。对于大型问题,将 A 作为稀疏矩阵传递。
A 以如下形式编写 M 个线性不等式
A*x <= b,
其中,x 是由 N 个变量组成的列向量,b 是具有 M 个元素的列向量。
例如,假设有以下不等式:
x1 +2x2 ≤10
3x1 +4x2 ≤20
5x1 +6x2 ≤30
通过输入以下约束来指定不等式。
A = [1 2;3 4;5 6]
b = [10,20,30]
示例: 要指定 x 分量总和等于或小于 1,请使用 A = ones(1,N) 和 b = [1]。
b — 线性不等式约束实数向量
线性不等式约束,指定为实数向量。b 是与 A 矩阵相关的包含 M 个元素的向量。对于大型问题,将 b 作为稀疏向量传递。
b 以如下形式编写 M 个线性不等式
A*x <= b,
其中,x 是由 N 个变量组成的列向量,A 是大小为 M×N 的矩阵。
例如,假设有以下不等式:
x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30
通过输入以下约束来指定不等式。
A = [1 2;3 4;5 6]
b = [10,20,30]
示例: 要指定 x 分量总和等于或小于 1,请使用 A = ones(1,N) 和 b = [1]。
Aeq — 线性等式约束实矩阵
线性等式约束,指定为实矩阵。Aeq 是 Me×N 矩阵,其中 Me 是等式的数目,而 N 是变量的数目(x0 中的元素数)。对于大型问题,将 Aeq 作为稀疏矩阵传递。
Aeq 以如下形式编写 Me 个线性等式
Aeq*x = beq
其中,x 是由 N 个变量组成的列向量,beq 是具有 Me 个元素的列向量。
例如,假设有以下不等式:
x1 +2x2 +3x3 =10
2x1 +4x2 + x3 =20
通过输入以下约束来指定不等式。
Aeq = [1 2 3;2 4 1]
beq = [10,20]
示例: 要指定 x 分量总和为 1,请使用 Aeq = ones(1,N) 和 beq = [1]。
beq — 线性等式约束实数向量
线性等式约束,指定为实数向量。beq 是与 Aeq 矩阵相关的包含 Me 个元素的向量。对于大型问题,将 beq 作为稀疏向量传递。
beq 以如下形式编写 Me 个线性等式
Aeq*x = beq
其中,x 是由 N 个变量组成的列向量,Aeq 是大小为 Me×N 的矩阵。
例如,请参考以下等式:
x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20
通过输入以下约束来指定等式。
Aeq = [1 2 3;2 4 1]
beq = [10,20]
示例: 要指定 x 分量总和为 1,请使用 Aeq = ones(1,N) 和 beq = [1]。
lb — 下界实数向量
下界,指定为实数向量。如果 x0 中的元素数等于 lb 中的元素数,则 lb 指定
x[i] >= lb[i](对于全部 i)。
如果 length(lb) < length(x0),则 lb 指定
x[i] >= lb[i] (1 <= i <= length(lb))。
如果 lb 的元素数少于 x0,求解器将发出警告。
示例: 要指定所有 x 分量为正,请使用 lb = zeros(size(x0))。
ub — 上界实数向量
上界,指定为实数向量。如果 x0 中的元素数等于 ub 中的元素数,则 ub 指定
x[i] <= ub[i](对于全部 i)。
如果 length(ub) < length(x0),则 ub 指定
x[i] <= ub[i] (1 <= i <= length(ub))。
如果 ub 的元素数少于 x0,求解器将发出警告。
示例: 要指定 x 的所有分量小于 1,请使用 ub = ones(size(x0))。
x0 — 初始点Float64[] (默认) | 实数向量
求解过程的初始点,指定为实数向量或数组。"trust-region-reflective" 和 "active-set" 算法使用 x0(可选)。
如果您没有为 "trust-region-reflective" 或 "active-set" 算法指定 x0,lsqlin 会将 x0 设置为零向量。如果零向量 x0 的任何分量违反边界,lsqlin 会将 x0 设置为边界定义的框内部的一个点。
示例: x0 = [4;-3]
options — lsqlin 的选项使用 optimoptions 创建的选项
lsqlin 的选项,指定为 optimoptions 函数的输出。
optimoptions 显示中缺少某些选项。这些选项在下表中以斜体显示。有关详细信息,请参见查看优化选项。
| 所有算法 | |
| Algorithm | 选择算法:
|
| Diagnostics | 显示关于要最小化或求解的函数的诊断信息。选择项是 true 或默认值 false。 |
| Display | 返回到命令行的输出显示级别。
|
| MaxIterations | 最大迭代次数,指定为正整数标量。默认值 -1 为占位符,lsqlin 将根据算法类型自动覆盖:"active-set" 算法使用 2000,其他算法使用 200。 |
| 仅 active-set 算法 | |
| ConstraintTolerance | 约束违反值容差;正标量。默认值为 1e-8。 |
| ObjectiveLimit | 容差(停止条件),标量。如果目标函数值低于 ObjectiveLimit 并且当前点可行,则迭代停止,因为问题很可能是无界的。默认值为 -1e20。 |
| OptimalityTolerance | 一阶最优性的终止容差,指定为正标量。默认值 NaN 为占位符,lsqlin "active-set" 算法在内部将使用 1e-8 覆盖此默认值。 |
| StepTolerance | 关于正标量 x 的终止容差。默认值 NaN 为占位符,lsqlin "active-set" 算法在内部将使用 1e-8 覆盖此默认值。 |
| 仅 trust-region-reflective 算法 | |
| FunctionTolerance | 关于函数值的终止容差,为正标量。默认值为 100*eps(),大约为 2.2204e-14。 |
| JacobianMultiplyFcn | 雅可比矩阵乘法函数,指定为函数句柄。对于大规模结构问题,此函数应计算雅可比矩阵乘积 C*Y、C'*Y 或 C'*(C*Y),而并不实际构造 C。以如下形式编写函数 W = jmfun(Jinfo,Y,flag) 其中 Jinfo 包含用于计算 C*Y(或 C'*Y、C'*(C*Y))的矩阵。jmfun 必须计算三种不同乘积之一,具体取决于 lsqlin 传递的 flag 的值:
|
| MaxPCGIter | PCG(预条件共轭梯度)迭代的最大次数,指定为正整数标量。默认值 -1 为占位符,lsqlin 在内部将使用 max(1,div(numberOfVariables,2)) 覆盖此默认值。 |
| OptimalityTolerance | 一阶最优性的终止容差,指定为正标量。默认值 NaN 为占位符,lsqlin "trust-region-reflective" 算法在内部将使用 100*eps() 覆盖此默认值。 |
| PrecondBandWidth | PCG(预条件共轭梯度)的预条件子上带宽。默认情况下,使用对角预条件(上带宽为 0)。对于某些问题,增加带宽会减少 PCG 迭代次数。将 PrecondBandWidth 设置为 -10 会使用直接分解 (Cholesky),而不是共轭梯度 (CG)。直接分解的计算成本较 CG 高,但所得的求解步质量更好。 |
| SubproblemAlgorithm | 确定迭代步的计算方式。与 "factorization" 相比,默认值 "cg" 采用的步执行速度更快,但不够准确。 |
| TolPCG | PCG(预条件共轭梯度)迭代的终止容差,正标量。默认值为 0.1。 |
| TypicalX | 典型的 x 值。TypicalX 中的元素数等于变量数。默认值 Float64[] 为占位符,lsqlin 在内部将使用 ones(numberofvariables) 覆盖此默认值。lsqlin 在内部使用 TypicalX 进行缩放。仅当 x 具有无界分量且一个无界分量的 TypicalX 值大于 1 时,TypicalX 才会起作用。 |
| 仅 interior-point 算法 | |
| ConstraintTolerance | 约束违反值容差;正标量。默认值为 1e-8。 |
| LinearSolver | 算法内部线性求解器的类型:
|
| OptimalityTolerance | 一阶最优性的终止容差,指定为正标量。默认值 NaN 为占位符,lsqlin "interior-point" 算法在内部将使用 1e-8 覆盖此默认值。 |
| StepTolerance | 关于正标量 x 的终止容差。默认值 NaN 为占位符,lsqlin "interior-point" 算法在内部将使用 1e-12 覆盖此默认值。 |
| ScaleProblem | 是否对线性最小二乘问题进行缩放处理,逻辑值,有时可以改善问题。默认值为 false。 |
problem — 优化问题结构体
优化问题,指定为具有以下字段的结构体。
| C | 项 C*x - d 中的矩阵乘数 |
| d | 项 C*x - d 中的加法常数 |
| Aineq | 线性不等式约束的矩阵 |
| bineq | 线性不等式约束的向量 |
| Aeq | 线性等式约束的矩阵 |
| beq | 线性等式约束的向量 |
| lb | 由下界组成的向量 |
| ub | 由上界组成的向量 |
| x0 | x 的初始点 |
| solver | "lsqlin" |
| options | 用 optimoptions 创建的选项 |
您必须在 problem 结构体中至少提供 C、d、solver 与 options 字段。
提示
您不能将热启动与 problem 参数结合使用。
ws — 热启动对象使用 optimwarmstart 创建的对象
热启动对象,指定为使用 optimwarmstart 创建的对象。热启动对象包含起点和选项,以及代码生成中的内存大小数据(可选)。请参见Warm Start Best Practices。
示例: ws = optimwarmstart(x0,options)
# 输出参数
x — 解实数向量
解,以向量形式返回,它在满足所有边界和线性约束的情况下最小化 C*x-d 的范数。
wsout — 热启动对象求解LsqlinWarmStart 对象
热启动对象求解,以 LsqlinWarmStart 对象形式返回。解点是 wsout.X。
您可以在后续的 lsqlin 调用中使用 wsout 作为输入热启动对象。
resnorm — 目标值实数标量
目标值,以标量值 norm(C*x-d)^2 形式返回。
residual — 解残差实数向量
解残差,以向量 C*x-d 形式返回。
exitflag — 算法停止条件整数
算法停止条件,以整数形式返回,标识算法停止的原因。下面列出 exitflag 的值以及相应的 lsqlin 停止原因。
| 3 | 残差的变化小于指定容差 options.FunctionTolerance。(trust-region-reflective 算法) |
| 1 | 函数收敛于解 x。 |
| 0 | 迭代次数超出 options.MaxIterations。 |
| -2 | 此问题不可行。或者,对于 interior-point 算法,步长小于 options.StepTolerance,但不满足约束。 |
| -3 | 此问题无界。 |
| -4 | 病态会妨碍进一步优化。 |
| -8 | 无法计算步的方向。 |
output — 求解过程摘要结构体
求解过程摘要,以包含优化过程信息的结构体形式返回。
| iterations | 求解器已进行的迭代次数。 |
| algorithm | 下列算法之一:"active-set", "trust-region-reflective", "mldivide"(对于无约束问题)。对于无约束问题,iterations = 0,且 output 结构体中的其余各项为默认值。 |
| constrviolation | 约束违反值,在违反约束时为正值("trust-region-reflective" 算法不返回此项)。constrviolation = maximum([0;norm(Aeq*x-beq, Inf);(lb-x);(x-ub);(A*x-b)]) |
| message | 退出消息。 |
| firstorderopt | 解处的一阶最优性。请参见一阶最优性度量。 |
| cgiterations | 求解器执行的共轭梯度迭代的次数。仅对 "trust-region-reflective" 算法为非默认值(-1)。 |
lambda — 拉格朗日乘数结构体
拉格朗日乘数,以具有以下字段的结构体形式返回。
| lower | 下界 lb |
| upper | 上界 ub |
| ineqlin | 线性不等式 |
| eqlin | 线性等式 |
# 提示
对于没有约束的问题,可以使用 mldivide(矩阵左除)。当没有约束时,lsqlin 返回 x = C\d;
由于要求解的问题始终为凸,因此 lsqlin 寻找一个全局解,尽管它不一定唯一;
如果您的问题有很多线性约束和很少的变量,请尝试使用 "active-set" 算法;
如果您使用 Aeq 和 beq 显式指定(而不是使用 lb 和 ub 隐式指定)等式,可能会得到更好的数值结果;
trust-region-reflective 算法不允许相等的上界和下界。在这种情况下,请换一种算法;
如果问题的指定输入边界不一致,则输出 x 为 x0,输出 resnorm 为 NaN 和 residual 为 Float64[];
您可以使用 trust-region-reflective 算法和雅可比矩阵乘法函数来求解一些大规模结构问题,包括那些因 C 矩阵太大而无法放入内存的问题。
# 算法
信赖域反射算法
此方法是一种子空间信赖域方法,基于 [1] 中所述的内部反射牛顿法。每次迭代都涉及使用预条件共轭梯度法(PCG)来近似求解大型线性方程组。请参见信赖域反射最小二乘,尤其是大规模线性最小二乘。
内点算法
'interior-point' 算法基于 quadprog "interior-point-convex" 算法。
活动集算法
"active-set" 算法基于 quadprog "active-set" 算法。
参考
[1] Coleman, T. F. and Y. Li. “A Reflective Newton Method for Minimizing a Quadratic Function Subject to Bounds on Some of the Variables,” SIAM Journal on Optimization, Vol. 6, Number 4, pp. 1040–1058, 1996.
[2] Gill, P. E., W. Murray, and M. H. Wright. Practical Optimization, Academic Press, London, UK, 1981.
热启动
热启动对象维护先前已求解问题的活动约束列表。求解器将尽可能多地携带活动约束信息来求解当前问题。如果前一个问题与当前问题差异太大,则不会重用任何活动约束集信息。在这种情况下,求解器实际上执行冷启动,以重新构建活动约束列表。