导航:首页 > 源码编译 > 非线性cg算法

非线性cg算法

发布时间:2023-08-20 06:27:03

❶ matlab解非线性方程组

1. fsolve
求解非线性方程组
方程:
F(x)=0
x是一个向量,F(x)是该向量的函数向量,返回向量值
2. 语法
x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
[x,fval] = fsolve(fun,x0)
[x,fval,exitflag] = fsolve(...)
[x,fval,exitflag,output] = fsolve(...)
[x,fval,exitflag,output,jacobian] = fsolve(...)
3. 描述
fsolve用于寻找非线性系统方程组的零点。
x = fsolve(fun,x0)以x0为初始值,努力寻找在fun中描述的方程组。
x = fsolve(fun,x0,options) 以x0为初始值,按照指定的优化设置“options”努力寻找在fun中描述的方程组。使用optimset设置这些选项。
[x,fval] = fsolve(fun,x0)返回在解x处的目标函数fun的值
[x,fval,exitflag] = fsolve(...)返回exitflag表示退出条件。
[x,fval,exitflag,output] = fsolve(...)返回output结构,该结构包含了优化信息。
[x,fval,exitflag,output,jacobian] = fsolve(...)返回在解x处的Jacobian函数。
4. 输入参数
4.1. fun
非线性系统方程。它是一个函数,以x作为输入,返回向量F。函数fun可以被指定为一个M文件函数的函数句柄。
x = fsolve(@myfun,x0)
这里的myfun是一个matlab函数,形如:
function F = myfun(x)
F = ... % Compute function values at x
fun也可以是一个异步函数的函数句柄:
x = fsolve(@(x)sin(x.*x),x0);
若用户定义的值为矩阵,则会被自动转换为向量。
若Jacobian能被计算出来且通过options = optimset('Jacobian','on')设置Jacobian选项为”on”,则函数fun必须在第2个输出参数中返回x处的Jacobian值J(它是一个矩阵)。注意:通过检查nargout的值,当fun被只带一个输出参数调用的情况下,该函数可避免计算J,仅只有一个输出参数。(这种情况下,优化算法仅需要知道F而不需J)。
function [F,J] = myfun(x)
F = ... % objective function values at x
if nargout > 1 % two output arguments
J = ... % Jacobian of the function evaluated at x
end
4.2. options
提供该函数有关的特定信息。
5. 输出参数
5.1. exitflag
一个用来表示算法终止原因的整数。
1:函数收敛到x
2:x的变化已经处在容许范围内
3:残差变化已经处在容许范围内
4:搜索方向飞幅度比指定的误差小
5:迭代次数超过options.MaxIter或函数估值的次数超过options.FunEvals
-1:算法被输出函数终止
-2:算法似乎收敛到一个非根点。
-3:可信半径变得太小
-4:沿当前方向的线性搜索不能足够地减小残差
5.2. output
包含关于优化信息的一个结构,其具有如下字段:
iterations:已经迭代的次数
funcCount:函数估值的次数
algorithm:所使用的算法
cgiterations:PCG迭代次数(仅适用于大规模算法)
stepsize:最终采取的步长(仅适用于中等规模算法)
firstorderopt:第1阶优化的观测值 。
5.3. options
优化设置。一些选项设置用于所有算法,部分与大规模算法(large-scale algrithm)。相关,部分与中等规模算法相关。可以使用optimset改变其中的设置。LargeScale选项指定使用哪种算法。
设为‘on’使用大规模算法,设为‘off’使用中等规模算法。
5.3.1. Medium-Scale and Large-Scale Algorithms
如下选项用于大规模和中等规模算法:
DerivativeCheck:将用户提供导数与有限差分导数相比较
Diagnostics:显示被解函数的诊断信息
DiffMaxChange:有限差分变量中的最大变化
DiffMinChange:有限差分变量中的最小变化
Display:显示的级别,‘off‘不显示输出,’iter‘显示每一步迭代的输出,’final‘显示最终的输出(默认)
FunValCheck:检查目标函数值是否有效。设为‘on’,当函数返回值为复数、inf或NaN将返回一个错误,设为‘off’将不显示错误。
Jacobian:设为‘ON’,fsolve将使用用户定义的Jacobian或Jacobian信息来估值目标函数,若设为‘off’,则使用有限差分逼近Jacobian。
MaxFunEvals:最大允许估值次数
MaxIter:最大迭代次数
OutputFcn:指定一个或多个输出函数,优化函数在每一个迭代过程中将调用这些函数。
PlotFcns:算法执行时显示进度条。从预定义中选择或自定义进度条。指定@optimplotx显示当前的点,@optimplotfunccount打印出函数的计数,@optimplotfval打印出函数值,@optimplotresnorm打印出残差范数,@optimplotstepsize打印出步长,@optimplotfirstorderopt打印优化参数的第1阶。
TolFun:函数值的终止误差。
TolX:x的终止误差
5.3.2. 仅适用于Large-Scale Algorithm
JacobMult:Jacobian乘法函数的函数句柄
JacobPattern
MaxPCGIter
PrecondBandWidth
TolPCG
5.3.3. 仅适用于Medium-Scale Algorithm
NonlEqnAlgorithm:
'dogleg' — Trust-region dogleg algorithm
(default)
'lm' — Levenberg-Marquardt
'gn' — Gauss-Newton
LineSearchType:'lm' (Levenberg-Marquardt)
'gn' (Gauss-Netwton) algorithms.

6. 使用优化工具箱完成以上函数操作
命令:optimtool

❷ Python怎么做最优化

一、概观
scipy中的optimize子包中提供了常用的最优化算法函数实现。我们可以直接调用这些函数完成我们的优化问题。optimize中函数最典型的特点就是能够从函数名称上看出是使用了什么算法。下面optimize包中函数的概览:
1.非线性最优化
fmin -- 简单Nelder-Mead算法
fmin_powell -- 改进型Powell法
fmin_bfgs -- 拟Newton法
fmin_cg -- 非线性共轭梯度法
fmin_ncg -- 线性搜索Newton共轭梯度法
leastsq -- 最小二乘
2.有约束的多元函数问题
fmin_l_bfgs_b ---使用L-BFGS-B算法
fmin_tnc ---梯度信息
fmin_cobyla ---线性逼近
fmin_slsqp ---序列最小二乘法
nnls ---解|| Ax - b ||_2 for x>=0
3.全局优化
anneal ---模拟退火算法
brute --强力法
4.标量函数
fminbound
brent
golden
bracket
5.拟合
curve_fit-- 使用非线性最小二乘法拟合
6.标量函数求根
brentq ---classic Brent (1973)
brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出这个算法的人名
bisect ---二分法
newton ---牛顿法
fixed_point
7.多维函数求根
fsolve ---通用
broyden1 ---Broyden’s first Jacobian approximation.
broyden2 ---Broyden’s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixing
excitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.实用函数
line_search ---找到满足强Wolfe的alpha值
check_grad ---通过和前向有限差分逼近比较检查梯度函数的正确性二、实战非线性最优化
fmin完整的调用形式是:
fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不过我们最常使用的就是前两个参数。一个描述优化问题的函数以及初值。后面的那些参数我们也很容易理解。如果您能用到,请自己研究。下面研究一个最简单的问题,来感受这个函数的使用方法:f(x)=x**2-4*x+8,我们知道,这个函数的最小值是4,在x=2的时候取到。
from scipy.optimize import fmin #引入优化包def myfunc(x):
return x**2-4*x+8 #定义函数
x0 = [1.3] #猜一个初值
xopt = fmin(myfunc, x0) #求解
print xopt #打印结果
运行之后,给出的结果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
程序准确的计算得出了最小值,不过最小值点并不是严格的2,这应该是由二进制机器编码误差造成的。
除了fmin_ncg必须提供梯度信息外,其他几个函数的调用大同小异,完全类似。我们不妨做一个对比:
from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):
return x**2-4*x+8
x0 = [1.3]
xopt1 = fmin(myfunc, x0)
print xopt1
print
xopt2 = fmin_powell(myfunc, x0)
print xopt2
print
xopt3 = fmin_bfgs(myfunc, x0)
print xopt3
print
xopt4 = fmin_cg(myfunc,x0)
print xopt4
给出的结果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 53
1.99999999997
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 12
Gradient evaluations: 4
[ 2.00000001]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 15
Gradient evaluations: 5
[ 2.]
我们可以根据给出的消息直观的判断算法的执行情况。每一种算法数学上的问题,请自己看书学习。个人感觉,如果不是纯研究数学的工作,没必要搞清楚那些推导以及定理云云。不过,必须了解每一种算法的优劣以及能力所及。在使用的时候,不妨多种算法都使用一下,看看效果分别如何,同时,还可以互相印证算法失效的问题。
在from scipy.optimize import fmin之后,就可以使用help(fmin)来查看fmin的帮助信息了。帮助信息中没有例子,但是给出了每一个参数的含义说明,这是调用函数时候的最有价值参考。
源码研究癖好的,或者当你需要改进这些已经实现的算法的时候,可能需要查看optimize中的每种算法的源代码。在这里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聪明的你肯定发现了,顺着这个链接往上一级、再往上一级,你会找到scipy的几乎所有源码!

阅读全文

与非线性cg算法相关的资料

热点内容
服务器上如何查看服务器的端口 浏览:676
单片机服务器编译 浏览:768
单口usb打印机服务器是什么 浏览:859
战地五开服务器要什么条件 浏览:954
在word中压缩图片大小 浏览:253
javatomcat图片 浏览:417
程序员生产智能创意 浏览:65
汇和银行app怎么登录 浏览:381
腾讯服务器如何上传源码 浏览:745
单片机的原理概述 浏览:512
火控pdf 浏览:267
如何复制云服务器centos环境 浏览:984
债权pdf 浏览:303
红色番字的app怎么下载 浏览:876
云服务器流程教课 浏览:704
中国农业银行app怎么没有网 浏览:999
几率表算法 浏览:904
程序员理工科 浏览:708
企业邮箱登录收件服务器地址 浏览:560
计算机思维与算法设计的重要性 浏览:664