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