丙型水驱特征曲线

import math
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import curve_fit


def read_column_to_list(file_path, sheet_name, column_name):
    # 读取Excel文件
    df = pd.read_excel(file_path, sheet_name=sheet_name)
    # 获取指定列的数据并转换为列表
    column_list = df[column_name].tolist()
    return column_list

def fit_linear_丙(x, y):
    def custom_func(x, a, b):
        return a * x + b

    popt, _ = curve_fit(custom_func, x, y)

    # 得到斜率K和截距B
    K, B = popt

    # 生成拟合直线的 x 值
    x_fit = np.linspace(min(x), max(x), 100)
    y_fit = K * x_fit + B

    # 绘制原始数据点和拟合直线
    plt.scatter(x, y, label='Original Data')
    plt.plot(x_fit, y_fit, color='red', label='Fitted Line')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend()
    plt.show()

    return K, B

def process_data_and_fit_丙 (file_path, sheet_name, column_name, start, end, n):
    Lp = read_column_to_list(file_path, sheet_name, column_name)

    Q_stage1 = Lp[start:end]
    Q0 = max(Q_stage1)

    Q_stage1 = [i / Q0 for i in Q_stage1]
    Q_stage1 = [math.pow(i, -n) for i in Q_stage1]

    XQ = [(i + start + 1, value) for i, value in enumerate(Q_stage1)]

    x = []
    y = []
    for index, item in enumerate(XQ):
        x.append(XQ[index][0])
        y.append(XQ[index][1])

    slope, intercept = fit_linear_丙(x, y)

    print(f"斜率: {slope},  截距: {intercept}, 截距固定为1")

    return slope, intercept

def divide_lists(listA, listB):
    listC = []
    for a, b in zip(listA, listB):
        try:
            listC.append(a / b)
        except ZeroDivisionError:
            listC.append(np.nan)  # 如果除数为 0,添加 NaN
    return listC

def calculate_NR(a3, b3):
    return (1 - math.pow(a3 * 0.05, 0.5)) / b3

def calculate_dfw(b3, NR, R, a3):
    """
    根据给定的参数计算dfw的值。

    :param b3: 变量b3的值,可以是单个数值或列表。
    :param NR: 变量NR的值,可以是单个数值或列表。
    :param R: 变量R的值,可以是单个数值或列表。
    :param a3: 变量a3的值,可以是单个数值或列表。
    :return: 计算得到的dfw的值,如果输入是列表,则返回列表形式的结果。
    """
    b3 = np.array(b3)
    NR = np.array(NR)
    R = np.array(R)
    a3 = np.array(a3)

    dfw = 2 * b3 * NR * (1 - b3 * NR * R) / a3

    return dfw.tolist()  # 将numpy数组转换为列表返回,如果输入是单个数值,返回的也是单个数值的列表形式

if __name__ == "__main__":
    file_path = "D:\\Pycharm\\project\\reformExcelData\\OceanOil\\check\\inf\\data\\PL19-3-E48ST1-deal-delete-sum.xlsx"
    sheet_name = "Sheet1"
    column_name_L = "平均月累产液量 (10⁴m³/d)"
    column_name_N = "平均月累产油量 (10⁴m³/d)"
    column_name_R = "气油比"

    Lp = read_column_to_list(file_path, sheet_name, column_name_L)
    Np = read_column_to_list(file_path, sheet_name, column_name_N)
    R = read_column_to_list(file_path, sheet_name, column_name_R)

    y = divide_lists(Lp, Np)
    x = Lp

    slope, intercept = fit_linear_丙(x, y)
    b3 = slope
    a3 = intercept
    print(f"b3:{slope}, a3:{intercept}")

    NR = calculate_NR(a3, b3)
    print(f"NR: {NR}")

    dfw = calculate_dfw(b3, NR, R, a3)
    print(f"dfw: {dfw}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值