python怎么读取optimize优化出来的结果

代码如下,该怎么读取优化出来的个变量的结果 

import pandas as pd
import math
import matplotlib.pyplot as plt
import numpy as np
import scipy.optimize as optimize
import pickle
from joblib import Parallel, delayed
from sko.PSO import PSO
class crm_model():
    def __init__(self,inj,pro,pre,time,dt):
        self.inj = inj
        self.pro = pro
        self.pre = pre
        self.time = time
        self.dt = dt
    def init_para(self,n1,n2):
        tao = np.random.rand(n2)
        gain = np.random.rand(n1,n2)
        p_j = np.random.rand(n2)
        We = np.random.rand(n2)*10000
        dt=1
        x0 = np.hstack((tao,gain.reshape(1,-1)[0],p_j,We))
        return x0
    def boundary(self,n1,n2,num):
        bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,0),)*n2
        if num == 0:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,0),)*n2
        elif num == 1:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
        elif num == 2:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
        elif num == 3:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,0),)*n2
        elif num == 4:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,0),)*n2
        elif num == 5:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,0),)*n2
        elif num == 6:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
        elif num == 7:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,0),)*n2
        elif num == 8:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
        elif num == 9:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
        elif num == 10:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
        elif num == 11:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
        elif num == 12:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,0),)*n2
        elif num == 13:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
        elif num == 14:
            bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
        else:
            raise('the num is wrong')
        bound1 = list(bound1)
        return bound1


    def rever_para(self,x0,n1,n2):
        tao = x0[:n2]
        gain = x0[n2:n2+n2*n1]
        gain = gain.reshape([n1,n2])
        p_j = x0[n2+n2*n1:n2+n2*n1+n2]
        We = x0[n2+n2*n1+n2:n2+n2*n1+n2+n2]
        return tao,gain,p_j,We

    def cal_q_hat(self,x0):
        inj = self.inj
        pro = self.pro
        pre = self.pre
        time = self.time
        dt = self.dt
        q_hat = np.zeros([1,len(pro)])
        q_hat2 = 0

        tao,gain,p_j,We = self.rever_para(x0,1,1)
        for j in range(1):  #生产井数
            for tn in range(len(pro )):   #时间天数
                q_hat1 = pro[j][0]*math.exp(-(time[tn]-time[0])/tao[j])
                for k in range(1,tn+1):
                    summ = 0
                    #summ = summ + gain1[j]*inj[1][k]+gain2[j]*inj[2][k]+gain3[j]*inj[3][k]
                    for i in range(len(inj)):
                        summ = summ + gain[i][j]*inj[i][k]
                    S1 = summ - p_j[j]*tao[j]*(pre[j][k]-pre[j][k-1])/dt + We[j]
                    q_hat2 += math.exp(-(time[tn]-time[k])/tao[j]) * (1-math.exp(dt)/tao[j])*S1
                q_hat[j][tn] = q_hat1 + q_hat2
                
        return q_hat

    def mse(self,x0):
        inj = self.inj
        pro = self.pro
        pre = self.pre
        time = self.time
        q_hat = self.cal_q_hat(x0)
        error = sum(sum((q_hat-pro)**2))
        return error
 
    def fit(self):
        boundry
        lb = []
        ub = []
        for i,j in boundry:
            lb.append(i)
            ub.append(j)
        result = optimize.minimize(self.mse,x0,method='SLSQP',bounds=boundry,options={'maxiter':5,'disp':True})
        # pso = PSO(func=self.mse,n_dim=4,lb = lb,ub = ub)
        a = 1
        return result
        opts_perwell = [opts(r['x']) for r in result]

## read data
inj = pd.read_csv('./data/injection.csv').values
pro = pd.read_csv('./data/production.csv').values
pre = pd.read_csv('./data/well_pressure.csv').values
time = pd.read_csv('./data/time.csv').values
n=len(time)
#dp=np.zeros((proj.shape[1],n))
inj=inj.transpose()
pro=pro.transpose()
pre = pre.transpose()
dt = 1
res = []
crm = crm_model(inj, pro, pre, time, dt)
for inj_i in inj:
    ls = []
    for num,(pro_j,pre_j) in enumerate(zip(pro,pre)):
        inj_i = np.expand_dims(inj_i,0)
        pro_j = np.expand_dims(pro_j,0)
        pre_j = np.expand_dims(pre_j,0)
        crm = crm_model(inj_i, pro_j, pre_j, time, dt)
        x0 = crm.init_para(len(inj_i),len(pro_j))
        boundry = crm.boundary(len(inj_i),len(pro_j),num)
        crm.cal_q_hat(x0)
        result= crm.fit()
        
        ls.append(result)
        a = 1
    res.append(ls)
print(res)



 

看不懂,但是你boundary这个函数写的。。。,一共16种情况写16个if...elif...else,大量重复。。。,建议你改一改,然后加一些备注,哪些是干什么的,要做什么,因为是真的看不懂

if num in [0,3,4,5,7,12]:
        bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,0),)*n2

elif num in [1,2,6,8,9,10,11,13,14]:
        bound1 =  ((0,np.inf),)*n2 + ((0,1),)*n2+ ((0,np.inf),)*n2+ ((0,np.inf),)*n2
else:
        raise('the num is wrong')

fit函数return result之后的操作是无效的,把 opts_perwell = [opts(r['x']) for r in result] 放到return之前

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632