实现最小化方法

我在2个变量x1,x2有一个函数

f = 3*x1^2 + 4*x2^2 + 5*x1 + 6*x2 + 10

考虑x是行向量,使得x = [x5,x6] ,其中x5,x6是向量的分量。 如果符号混淆,让我们考虑x = [x1,x1]x1,x2可以是任意组件。 对于y ,同样的论点也适用。

然后我想找到a from (x + ay)这样它会使f最小化。 a是实常数, xy是向量。 这在上面解释了。

如果这没有意义,那么让我们将x,y视为具有2个位置的1维数组。 因此,x(1),x(2),y(1),y(2)是它们的组成部分。 然后我想将数组y乘以符号变量a

例如, x=[4,5]y=[-2,3]则, (x + ay) = (4,5) + a(-2,3) = (4-2a,5+3a)a是这里未知的符号变量。

f1替换(更清楚的是, f x1 = 4-2a的定义中的第一个参数,第二个参数x2=5+3a

f1 = 3*(4-2a)^2 + 4*(5+3a)^2 + 5*(4-2a) + 6*(5+3a) + 10 ……….. 。(eq.1)

然后函数f1在一个变量a变得未知,并且可以使用1D最小化算法(例如黄金分割搜索)在给定间隔[x_lower,x_upper]最小化。

我的问题是:

鉴于不同的xy

  • 如何评估(x+ay)并将其传递(或替换?)到函数f (eq1)
  • 如何创建’动态’函数f1 ,如公式1所示。 1,将它传递给1D最小化算法? 通过动态,我的意思是函数f1每次都会改变xy

我感兴趣的是这个问题的低级实现(尽可能地坚持语言的基本function,而不使用语言特定的function或面向对象的function),但是在python,MATLAB,C或任何其他语言中, ‘低级。’ 你能提出什么建议吗?

更新:我不想使用python,MATLAB或任何其他语言的符号。

我用我自己的话来改写你的问题,因为目前forms的问题令人困惑:

你有一个函数f(x1,x2) = 3*x1^2 + 4*x2^2 + 5*x1 + 6*x2 + 10 x1x2是从xyy的乘积求和得到的2D矢量的分量,其中xy是给定矢量, a是标量。 您希望获得将此关系替换为f

请注意,符号有点令人困惑,所以我将使用x = z+a*y ,其中z(替换你使用的x)和y是给定的向量。

让我们将f定义为Matlab中的匿名函数(您也可以轻松使用函数文件):

 f = @(x) 3*x(1)^2 + 4*x(2)^2 + 5*x(1) + 6*x(2) + 10; 

请注意,我的写法与你的不同,即x(1)x(2)而不是x1x2 。 这意味着我使用向量的组件而不是两个不相关的变量。

那么,让我们写a涉及一个函数的等式:

 g = @(a) z + a*y; 

函数g(a)返回每个值a的向量,服从g(a) = z+a*y

现在你可以做替换:

 h = @(a) f(g(a)) 

h是所需的函数,它接受a作为输入并返回从z+a*y获得的向量处应用的a的值。

你可以使用eval convert string来运行

 f = 'x+a*y' x = 4 y = 3 for a in xrange(3): print eval(f) output: 4 7 10