【问题标题】:function of two variables reduced to 1 variable but issues with minimizing in Python两个变量的函数减少到 1 个变量,但在 Python 中最小化的问题
【发布时间】:2022-01-13 21:04:21
【问题描述】:

我有一个多变量函数(代码如下),取决于x1x2,我为此函数有一个目标输出值,名为target。我修复了x1,并在外部函数中提供了我的targetfind_x2。目标是最小化内部函数error,这只是我的输出目标和结果值est之间的平方距离,相对于x2

但运行后:

find_x2(target = .12, x1 = 100) 产生x2 = 0.99899,但应该大致是.80

看起来该函数正在最小化est 而不是x2,但我不明白为什么。任何帮助将不胜感激。

代码:

import numpy as np
from scipy.optimize import minimize_scalar, minimize 

def find_x2(x1, target): 
    def error(x2, x1 = x1, target = target):
        k = np.zeros(x1) 
        V = np.zeros(x1) 
        for i in range(x1): 
            try:
                k[i-1] = (i/x1)**(-1/x2)
            except: 
                k[x1-1]=1
        for i in range(x1): 
            V[i] = k[i]/sum(k)
        est = sum(V**2) 
        return (target - est)**2
    return minimize_scalar(error, bounds = (.001,.999), method = 'bounded') 

【问题讨论】:

  • minimize_scalar 的第一个参数应该是error 吗?看起来您正在最小化其他一些功能
  • 谢谢,应该是error,谢谢。我将编辑问题以防止进一步混淆。
  • 你能提供一个合理的三元组(x1,x2,目标)吗?我想运行这个
  • x1 = 100,目标 = 0.12 和 x2 = 0.8016846
  • try/except 不像你期望的那样工作——在每个 k 向量的最后一个元素中都有 nan。也许计算为向量,然后使用 numpy.roll 之后移动元素

标签: python optimization scipy


【解决方案1】:

试试这个版本:

def find_x2(x1, target): 
    def error(x2, x1 = x1, target = target):
        k = np.zeros(x1) 
        V = np.zeros(x1) 
        for i in range(x1): 
            try:
                k[i-1] = (x1/i)**(1/x2)
            except:
                k[x1-1]=1
        for i in range(x1):
            V[i] = k[i]/sum(k)
        est = sum(V**2)
        return (target - est)**2
    return minimize_scalar(error, bounds = (.001,.999), method = 'bounded')
find_x2(100, 0.12)

打印

    fun: 9.668753433849857e-14
 message: 'Solution found.'
    nfev: 14
  status: 0
 success: True
       x: 0.801701074855243

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2017-06-14
    • 2012-10-31
    • 1970-01-01
    • 2017-04-05
    • 2017-09-09
    • 2023-03-26
    • 2021-04-05
    相关资源
    最近更新 更多