【发布时间】:2012-07-13 13:39:15
【问题描述】:
我想知道是否有 C/C++ 库或 Matlab 代码技术可以使用最小化求解器来确定实数和复数。这是一个代码 sn-p 显示我想做的事情。例如,假设我知道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 是正确的值。
在将Utilde 作为复数的情况下,Matlab 或 C/C++ 中是否有办法确保正确收敛?也许我必须更改上面的代码?
如果在 Matlab 中没有本地方法可以做到这一点,那么也许可以 问题的要点是:是否存在多变量(即 Nelder-Mead 或类似算法)优化库,能够 处理真实和复杂的输入和输出?
还有一个问题是函数是否收敛。一世 不知道是算法还是函数。我是否需要更改
Utilde = U * (1 / exp(2 * x)) * exp( 1i * 2 * x)表达式中的某些内容以使其收敛?
【问题讨论】:
-
根据我的经验:使用这些内置的最小化程序通常会给您带来更多麻烦而不是帮助。如果您确实需要这样做,我会坚持使用 Python - 使用 MATLAB 可能不会更好。
-
当然——在 Python 中设置这个优化问题的最佳方法是什么?是否有 Python 工具可以使用复数进行优化?
-
@NicholasKinar 我现在对复数的算术规则有点不确定,但是如果你只想在优化中检索最上面的
x和U值,会不会将diff指定为diff = abs( Utilde - U * (1 / exp(2 * x)) * exp( 1i * 2 * x ) )是否更合适?或者从微分的角度来看,差的平方而不是绝对差更好? -
@AndersGustafsson:感谢您的评论。嗯……我试过了,但我仍然无法让所有
x和U收敛。例如,x = 7和U = 10。也许我做错了什么。 -
@NicholasKinar 我进一步研究了这个问题并提供了答案。请看看你是否同意。
标签: c++ c matlab mathematical-optimization numerical-methods