实施最小化方法

时间:2016-06-04 17:20:42

标签: python c algorithm matlab optimization

我有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中找到(x + ay),以便最小化fa是实常数,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中变得未知,并且可以使用一维最小化算法(例如golden段搜索)最小化,给定间隔[x_lower,x_upper]。< / p>

我的问题是:

给出不同的xy

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

我感兴趣的是这个问题的低级实现(尽可能地坚持语言的基本功能,而不使用语言特定功能或面向对象的功能),python,MATLAB,C或任何其他语言,但又处于低水平。&#39;你能提出一些建议吗?

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

2 个答案:

答案 0 :(得分:1)

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

您有一个功能f(x1,x2) = 3*x1^2 + 4*x2^2 + 5*x1 + 6*x2 + 10x1x2是从x求和ay的乘积得到的2D向量的组成部分,其中x和{ {1}}被赋予向量,y是标量。您希望获得将此关系替换为a

所产生的函数

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

让我们将x = z+a*y定义为Matlab中的匿名函数(您也可以轻松使用函数文件):

f

请注意,我的写法与您的不同,即f = @(x) 3*x(1)^2 + 4*x(2)^2 + 5*x(1) + 6*x(2) + 10; x(1)而不是x(2)x1。这意味着我使用向量的组件而不是两个不相关的变量。

然后,让我们编写一个涉及x2的等式作为函数:

a

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

现在你可以进行替换:

g(a) = z+a*y

h = @(a) f(g(a)) 是所需的函数,它接受输入并返回从h获得的向量处应用的a值。

答案 1 :(得分:-1)

你可以使用eval convert string来实现

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

output:
4
7
10