【问题标题】:Utilizing scipy.optimize.minimize properly正确使用 scipy.optimize.minimize
【发布时间】:2019-11-01 06:33:10
【问题描述】:

我有 2 个固定参数 (A,B) 和 2 个非固定参数 (C,T_o) 用于计算方程 R_computed = A + B*tanh((T-T_o)/C) 中的计算响应值。与之比较的实际值“R”需要在两者之间具有最小的可能误差。我已经用一个对平方和求平方根的函数计算了最小误差。

该功能是我试图在optimize.minimize 中最小化的功能,C,T_ox0args= (A,B,R,T)

目前我在第 52 行遇到错误: R_comp = A + B*np.tanh((T-T_o)/C)

TypeError: 只有长度为 1 的数组可以转换为 Python 标量

这个错误是新的,我之前已经解决了这个问题,但由于我把代码弄乱了太多,所以无法回到原来的位置。最终目标是绘制(T,R)(T,R_new),其中 R_new 基本上是适合 R 的曲线

任何注释掉的都是我尝试过的。

import numpy as np
#import math
import matplotlib.pyplot as plt 
import scipy

import csv
import pandas as pd
#import operator

df =pd.DataFrame.from_csv('test.csv', index_col = None)
counter = 0
upper = 0
Lower_shelf = 2.2;
#import csv

with open('test.csv') as fin:
    csvin = csv.reader(fin, skipinitialspace=True)
    col_header = next(csvin, [])[1:]
    row_header, data = zip(*((row[0], row[1:]) for row in csvin))
    for row in data:
        if int(row[2]) >= 95 :
            upper = upper + float(row[0])
            counter = counter + 1
Upper_shelf = upper/counter
A = 33.18
B = 30.98      
T = array([  67.4,  100.7,  125.1,  150.6,  175.6,  200.3,  224.9,  249.8,
        275. ,  300. ,  350.5,  399.9,  425. ,  450.2,  475. ])
R = array([  6. ,  15.5,  20. ,  22. ,  30.5,  34. ,  45. ,  57. ,  54. ,
        63. ,  59. ,  64. ,  66. ,  64. ,  69. ])
T_o = (Tmax + Tmin)/2
C = (Tmax -T_o)/2


def ssre (A,B,T,R,C):
    R_comp = A + B*np.tanh((T-T_o)/C)

    ret_val = np.sqrt((R-R_comp)**2)
    return ret_val

Result = scipy.optimize.minimize(fun = ssre,x0 =[C,T_o], args= (A, B, R,T))
C_new = Result.x[0]
T_new = Result.x[1]
R_new = A + B*np.tanh((T-T_new)/C_new)
print(Result)
plt.plot(T,R, 'o')
plt.plot(T,R_new)

【问题讨论】:

  • 请提供minimal, reproducible example。包含导入和初始化变量(例如A, B, R, T)会很有用,这样我们就可以了解它们的形状。这对于您的错误类型至关重要。
  • 这很好,但如果没有正确的初始化,我们只能猜测。在这个版本中,由于我们没有.csv 文件,我们仍然对A, B, R, T 没有任何线索。
  • A变成一个数;在这种情况下 A = 33.2,B = 31
  • T = array([ 67.4, 100.7, 125.1, 150.6, 175.6, 200.3, 224.9, 249.8, 275. , 300. , 350.5, 399.9, 425. , 450.2, 475. ])跨度>
  • R = array([ 6. , 15.5, 20. , 22. , 30.5, 34. , 45. , 57. , 54. , 63. , 59. , 64. , 66. , 64. , 69. ])

标签: python scipy scipy-optimize scipy-optimize-minimize


【解决方案1】:

解决这个问题有点棘手,因为尽管进行了编辑,代码仍然包含各种问题。作为对未来帖子的建议,请尝试发布minimal, reproducible example,以便其他用户更容易理解您的代码和目标。因此,您将获得快速且高质量的答案。

关于您的代码,我更正了以下内容:

  • 更正 ssre 函数调用您将变量传递给它的方式。
  • 更正等于 l2 范数的平方和的平方根的计算。
import numpy as np
import matplotlib.pyplot as plt 
from scipy.optimize import minimize


def ssre (x, A, B, R, T):
    C, T_o  = x[0], x[1]
    R_comp  = A + B*np.tanh((T - T_o) / C)
    ret_val = np.linalg.norm(R - R_comp, 2)
    return ret_val

# initializations 
A   = 33.2
B   = 31
T   = np.array([67.4, 100.7, 125.1, 150.6, 175.6, 200.3, 224.9, 249.8, 275., 300., 350.5, 399.9, 425., 450.2, 475.])
R   = np.array([  6.,  15.5,   20.,   22.,  30.5,   34.,   45.,   57.,  54.,  63.,   59.,   64.,  66.,   64.,  69.])
T_o = (np.max(T) + np.min(T))/2
C   = (np.max(T) - T_o)/2

# minimize
Result = minimize(fun  = ssre,
                  x0   = [C, T_o],
                  args = (A, B, R, T))
# format results
C_new = Result.x[0]
T_new = Result.x[1]
R_new = A + B*np.tanh((T-T_new)/C_new)

# print and plot
print(Result)
plt.plot(T, R, 'o')
plt.plot(T, R_new)
plt.show()

结果:

      fun: 11.786475736024007
 hess_inv: array([[84.27271526, -4.45138785],
       [-4.45138785, 23.62509084]])
      jac: array([1.78813934e-06, 9.53674316e-07])
  message: 'Optimization terminated successfully.'
     nfev: 76
      nit: 14
     njev: 19
   status: 0
  success: True
        x: array([ 98.74898359, 182.5084917 ])

【讨论】:

    猜你喜欢
    • 2015-03-18
    • 2014-01-03
    • 2015-07-20
    • 2019-01-23
    • 1970-01-01
    • 2015-02-19
    • 2020-10-22
    • 2019-12-12
    • 2014-07-13
    相关资源
    最近更新 更多