我有一个包含 2 个变量的函数 x1,x2
f = 3*x1^2 + 4*x2^2 + 5*x1 + 6*x2 + 10
考虑 x
是满足 x = [x5,x6]
的行 vector ,其中 x5,x6
是 vector 的分量。如果符号令人困惑,让我们考虑 x = [x1,x1]
但 x1,x2
可以是任意组件。 y
也是同样的论点。
然后我想从 (x + ay)
中找到 a
,这样它将最小化 f
。 a
是实常数,x
和y
是 vector 。上面已经解释过了。
如果这没有意义,那么让我们将 x,y
视为具有 2 个位置的一维数组。因此,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
。 ............(等式 1)
然后函数 f1
在一个变量 a
中变得未知,可以使用一维最小化算法将其最小化,例如 golden部分搜索,给定一个区间 [x_lower,x_upper]
。
我的问题是:
给定不同的x
,y
,
- 如何计算
(x+ay)
并将其传递(或替换?)到函数f (eq1)
中? - 如何创建“动态”函数
f1
,如 eq. 1、传递给一维最小化算法?所谓动态,我的意思是函数f1
每次都会为x
、y
改变。
我对用 python、MATLAB、C 或任何其他语言实现这个问题的低级实现感兴趣(尽可能坚持语言的基本特性,不使用特定语言的特性或面向对象的特性),但再次处于“低水平”。你能推荐点什么吗?
更新:我不想使用来自 python、MATLAB 或任何其他语言的符号。
最佳答案
我正在用自己的话重新表述您的问题,因为当前形式的问题令人困惑:
您有一个函数 f(x1,x2) = 3*x1^2 + 4*x2^2 + 5*x1 + 6*x2 + 10
。 x1
和 x2
是通过将 x
与 a
和 的乘积相加获得的二维 vector 的分量>y
,其中 x
和 y
是给定的 vector ,a
是标量。您想获得将此关系代入 f
所产生的函数。
请注意,该符号有点令人困惑,因此我将改用 x = z+a*y
,其中 z(替换您使用的 x)和 y 是给定的 vector 。
让我们在 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
。这意味着我使用的是 vector 的分量而不是两个不相关的变量。
然后,让我们写出将 a
也作为函数的等式:
g = @(a) z + a*y;
函数 g(a) 为每个值 a
返回一个 vector ,遵守 g(a) = z+a*y
。
现在你可以做替换了:
h = @(a) f(g(a))
h
是所需的函数,它将 a 作为输入并返回应用于从 z+a*y
获得的 vector 的 a
的值>.
关于python - 实现最小化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37633007/