我想知道是否有C/C++库或Matlab代码技术来确定使用最小化求解器的实数和复数。这是一个代码片段,显示我想要做什么。例如,假设我知道Utilde
,但不知道x
和U
变量。我想使用优化(fminsearch
)来确定x
和U
,给出Utilde
。请注意,Utilde
是一个复数。寻找复数作为输入的优化
x = 1.5;
U = 50 + 1i*25;
x0 = [1 20]; % starting values
Utilde = U * (1/exp(2 * x)) * exp(1i * 2 * x);
xout = fminsearch(@(v)optim(v, Utilde), x0);
function diff = optim(v, Utilde)
x = v(1);
U = v(2);
diff = abs(-(Utilde/U) + (1/exp(2 * x)) * exp(1i * 2 * x ));
上面的代码没有收敛到正确的值,并且xout = 1.7318 88.8760
。但是,如果U = 50
不是复数,则xout = 1.5000 50.0000
是合适的值。
有没有在Matlab或C/C++中确保正确收敛的方法,假设Utilde
为复数?也许我必须更改上面的代码?
如果没有办法在Matlab本身做到这一点,那么也许这个问题的一个 要点是这样的:有一个多变量(即 内尔德 - 米德或类似的算法)优化库,能够使用 来处理真实和复杂的输入和输出?
还有一个问题是函数是否收敛。我不知道它是算法还是函数。我是否需要改变
Utilde = U * (1/exp(2 * x)) * exp(1i * 2 * x)
表达式中的某些内容以使其收敛?
从我的经验:使用这些内置的最小化过程往往给你更多的麻烦而不是帮助。如果你确实需要这样做,我会坚持Python - 用MATLAB它可能不会更好。 – 2012-07-13 17:16:42
当然 - 设置此优化问题的最佳方式是什么?有没有可以使用复数来优化的Python工具? – 2012-07-13 23:06:15
@NicholasKinar现在我对复数的算术规则有点不确定,但是如果您只想在优化中检索最上面的'x'和'U'值,那么指定'diff 'as'diff = abs(Utilde -U *(1/exp(2 * x))* exp(1i * 2 * x))'?或者从差异的角度来看,差异平方而不是绝对差异更好呢? – 2012-07-24 21:07:07