2026a

# 编写基于问题的最小二乘法的目标函数

要指定基于问题的最小二乘法的目标函数,请将目标明确写为平方和或表达式范数的平方。通过明确使用最小二乘表示,您可以获得最合适、最有效的求解器问题的方案。例如,

using TyOptimization
using TyMath
t = collect(1:10)
x = optimvar("x",10)
obj =@fcn2expr sum((x - t).^2) x 
prob = optimproblem(Objective=obj)
solver, = solvers(prob)
solver =
 :lsqlin

也可以将目标写为平方范数。

obj2 = norm(x-t)^2
prob2 = optimproblem(Objective=obj2)
solver2, = solvers(prob2)
solver2 =
 :lsqlin

若将目标表示为数学上等价的表达式会产生一个问题,软件会将其解释为一般二次问题。

obj3 = dot(x - t,x - t)
prob3 = optimproblem(Objective=obj3)
solver3, = solvers(prob3)
solver3 =
 :quadprog

类似地,将非线性最小二乘写为范数的平方或优化表达式的显式平方和。这个目标是一个明确的平方和。

t = LinRange(0,5,100)
A = optimvar("A")
r = optimvar("r")
obj4 = @fcn2expr sum((A*exp.(r*t) - (3*exp.(-2*t) + 0.1*randn(size(t)))).^2) A r
prob4 = optimproblem(Objective=obj4)
solver4, = solvers(prob4)
solver4 =
 :lsqnonlin

等效地,将目标写为平方范数。

obj5 = @fcn2expr norm(A*exp.(r*t) - (3*exp.(-2*t) + 0.1*randn(size(t))))^2 A r
prob5 = optimproblem(Objective=obj5)
solver5, = solvers(prob5)
solver5 =
 :lsqnonlin

软件自动识别为最小二乘问题的形式仅以上两种,归纳如下:

  • sum((expr).^2) ;

  • norm(expr)^2 。

如果您将目标函数写成标准平方和形式(形如 ,且不含常数项),可以通过手动指定最小二乘求解器进行求解。

using TyOptimization
x = optimvar("x",Lowerbnd=-3,Upperbnd=3)
y = optimvar("y",Lowerbnd = 0,Upperbnd=9)
obj = (10*(y - x^2))^2 + (1 - x)^2
prob = optimproblem(Objective=obj)
x0=(x = -2.1,y = 2.2)
sol,fval = Solve(prob,x0,Solver="lsqnonlin")
Solving problem using lsqnonlin.

sol =
(y = 0.9999999659546344, x = 0.9999999837361884)

fval =
4.948658282209146e-16

注意

仅限 sum((expr).^2)、norm(expr)^2 以及标准平方和形式的表达式作为目标函数的优化问题可以使用最小二乘求解器进行求解,其中标准平方和形式需要手动指定最小二乘求解器。

# 另请参阅

Solve | solvers