实现最小化方法
我在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
是实常数, x
和y
是向量。 这在上面解释了。
如果这没有意义,那么让我们将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]
最小化。
我的问题是:
鉴于不同的x
, y
,
- 如何评估
(x+ay)
并将其传递(或替换?)到函数f (eq1)
? - 如何创建’动态’函数
f1
,如公式1所示。 1,将它传递给1D最小化算法? 通过动态,我的意思是函数f1
每次都会改变x
,y
。
我感兴趣的是这个问题的低级实现(尽可能地坚持语言的基本function,而不使用语言特定的function或面向对象的function),但是在python,MATLAB,C或任何其他语言中, ‘低级。’ 你能提出什么建议吗?
更新:我不想使用python,MATLAB或任何其他语言的符号。
我用我自己的话来改写你的问题,因为目前forms的问题令人困惑:
你有一个函数f(x1,x2) = 3*x1^2 + 4*x2^2 + 5*x1 + 6*x2 + 10
。 x1
和x2
是从x
与y
和y
的乘积求和得到的2D矢量的分量,其中x
和y
是给定矢量, 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)
而不是x1
和x2
。 这意味着我使用向量的组件而不是两个不相关的变量。
那么,让我们写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