1

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

该功能是我试图在 and 中最小化的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)R_new(T,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)

4

1 回答 1

0

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

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

  • 更正 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 ])

在此处输入图像描述

于 2019-06-19T14:47:49.047 回答