24小时热门版块排行榜    

查看: 2753  |  回复: 26

m261140814

铜虫 (初入文坛)

【答案】应助回帖


感谢参与,应助指数 +1
fegg7502: 金币+1, 鼓励交流 2013-12-26 09:05:58
你是想用一个恒定的迭代因子吗?动的行不?我没做过类似的工作,不知道说的对不对?之前做拟合,用的列文伯格-马夸而特法,就是可以变的。你可以试试

[ 发自小木虫客户端 ]
21楼2013-12-25 05:00:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

戴钢盔的猪头

木虫 (知名作家)

【答案】应助回帖


fegg7502: 金币+1, 应助指数+1, 3ks 2013-12-26 09:06:12
忽然发现楼主的问题还有不等式双边约束在里面。那还是要加个内点罚函数的。

[ 发自手机版 http://muchong.com/3g ]
22楼2013-12-25 11:38:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

自己的歌

银虫 (初入文坛)

引用回帖:
22楼: Originally posted by 戴钢盔的猪头 at 2013-12-25 11:38:26
忽然发现楼主的问题还有不等式双边约束在里面。那还是要加个内点罚函数的。

说的是用最优化方法解是吧?
23楼2013-12-25 16:43:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

戴钢盔的猪头

木虫 (知名作家)

引用回帖:
23楼: Originally posted by 自己的歌 at 2013-12-25 16:43:51
说的是用最优化方法解是吧?...

哦,其实也不一定。一维问题直接用模拟退火也行,就是慢点,但程序超级简单,啥梯度啊海塞啊都不需要用到了。
24楼2013-12-25 21:56:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

自己的歌

银虫 (初入文坛)

引用回帖:
24楼: Originally posted by 戴钢盔的猪头 at 2013-12-25 21:56:34
哦,其实也不一定。一维问题直接用模拟退火也行,就是慢点,但程序超级简单,啥梯度啊海塞啊都不需要用到了。...

这两天在用拟牛顿法解这个方程组,100方程的时候,解的时间得40多秒。。理想的时间是5-10秒左右。有没有可能比较快的方法?
25楼2013-12-26 09:56:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

戴钢盔的猪头

木虫 (知名作家)

【答案】应助回帖

引用回帖:
25楼: Originally posted by 自己的歌 at 2013-12-26 09:56:18
这两天在用拟牛顿法解这个方程组,100方程的时候,解的时间得40多秒。。理想的时间是5-10秒左右。有没有可能比较快的方法?...

你要快还是要准啊?而且拟牛顿也不改这么慢。你的问题我想了下,最好这样做:因为初值不好确定,可以先用模拟退火,一元的问题很快就能找到一个近似解。然后用这个近似解作为初值,用优化算法结合内点法求带不等式约束的优化问题。至于优化算法,用L-M算法好了,这是个超定最小二乘问题。

[ 发自手机版 http://muchong.com/3g ]
26楼2013-12-26 11:08:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cobrasq

金虫 (小有名气)

【答案】应助回帖

这是有约束非线性方程组优化问题,自变量的范围形成一个线性约束。利用内点罚函数算法(MATLAB优化工具箱自带)。

以下是如何求数值解。注意,为了简化,让优化工具箱自行计算方程组的数值一阶微分(雅可比矩阵)和二阶微分(Hessian矩阵)。如果结果不理想,可以先调节 options 中的参数。如果还不理想,可以利用符号运算工具箱求出雅可比矩阵和 Hessian 矩阵。

1. 建立一个函数文件 func1.m

function y=obj_func(x)
% x 为列向量
%常量
A=0.8;
B1=0.1;
C1=0.4;
B2=0.2;
C2=0.5;

%临时变量
f1 = (x+ B1)./ln(x + C1);
f2 = (x+B2)./ln(x+C2);
temp_y = x + A - f1 - f2;

%目标方程为每项方程的平方和
y = 0.5*sum(temp_y.^2);

2. 建立一个主程序 solve_6_unknowns.m

%清屏,清工作区
clc
clear all

%设置优化算法参数
maxiter = 20000;
maxfuneval = length(x0)*maxiter;
options = optimset('Display‘, ’off',...
    ‘Algorithm', 'interior-point',...
    'GradObj', 'off',...
    'GradConstr', 'off',...
    'Hessian', 'off',...
    'TolX', 1e-6,...
    'TolFun', 1e-6,...
    'MaxIter', maxiter,...
    'MaxFunEvals', maxfuneval);

%设置初始值
x0 = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]';

%设置边界
lb = [8, 8, 8, 8, 8, 8]';
ub = [12, 12, 12, 12, 12, 12]';

%调用优化函数
[x, fval, exitflag, output] = fmincon(@obj_func, x0, ...
    [], [], ...
    [], [], ...
    lb, ub, ...
    [], options);

%显示结果
disp(['Iterations: ',num2str(output.iterations)])
disp(['Func Evals: ', num2str(output.funcCount)])
disp(['Algorithm: ',output.algorithm])
disp(['exit flag = ',num2str(exitflag)])
disp(['error = ( ',num2str(fval','%-15.6e'),' )'])
disp(['x1 = ( ',num2str(x(1),'%-15.6f'),' )'])
disp(['x2 = ( ',num2str(x(2),'%-15.6f'),' )'])
disp(['x3 = ( ',num2str(x(3),'%-15.6f'),' )'])
disp(['x4 = ( ',num2str(x(4),'%-15.6f'),' )'])
disp(['x5 = ( ',num2str(x(5),'%-15.6f'),' )'])
disp(['x6 = ( ',num2str(x(6),'%-15.6f'),' )'])
27楼2014-01-08 23:50:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 自己的歌 的主题更新
信息提示
请填处理意见