我需要使用优化工具箱设置我的第一个优化问题的指导。
我有一个代表长衬衫袖子的3D表面模型。我已经定义了一个穿过表面的切割平面。通过PCA获得平面的初始方向:表面模型顶点的第一主成分定义平面法向量。我的优化是将平面定向为平面矢量u,v(最初是第二和第三个原点。比较),以便最小化平面和曲面模型交叉的横截面积。我想将方向约束在围绕每个轴的X度旋转内,以缩小解空间。
我的问题是:
你能为这种情况推荐一个特定的解算器吗?我可以同时解决两个旋转角度(大约是u和v)吗?
我应该解决正常向量的3个组成部分吗? (在应用所需的约束时)
我是否必须使用嵌套函数设置目标函数来传递曲面模型数据,初始面方向等?
我很难在网上找到一个与我的案例类似的例子。
我感谢任何建议,并提前为我的天真道歉。
答案 0 :(得分:0)
我不熟悉您的特定示例,但大多数最小化器相当类似,您只需要遵循一些框架即可使优化器工作。
这是一些函数最小化代码,我在这里调整了但过去曾使用过。 fmincon是一个很好的通用函数最小化器,你可以在参数(边界,等式约束和不等式约束)上设置许多不同的约束。它在所有情况下都不是最有效的,但它可能会给你一个良好的开端。
基本上你想创建一个初始猜测,设置边界,然后通过引用fitfun函数调用fmincon。
function [t2, pd, offset] = t2fit(te, mm)
% Intial guess
x0 = [(-1/p(1))/fact, max(mm) 0]; % t2 pd
% Other constratints
A = []; B = []; Aeq = []; Beq = [];
% Bounds
LB=[ 1/fact 0 -1 ]; UB = [ 1000/fact 1 1 ];
% Matlab options to the optimizer
opts = optimset('fmincon');
opts = optimset(opts, 'display', 'none');
% Call the minimization routine
x = fmincon(@fitfun, x0, A, B, Aeq, Beq, LB, UB, [], opts, te, mm);
% Get the output variables
t2 = x(1);
pd = x(2);
offset=x(3);
%%===================================================================
function dd = fitfun(x, te, mm)
% The current value of the three input parameters
t2 = x(1);
pd = x(2);
offset = x(3);
% Calculate the model curve
yy = pd .* exp( -te ./ t2 ) + offset;
% Compute the error between the model curve the
% the measured curve -- dd is returned
dd = sqrt(sum( (yy-mm).^2 ));
考虑到你的问题,你可能想要使用lsqcurvefit或类似的东西。