【发布时间】: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_o 是x0 和args= (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