高温合金的检索与预测

python:

import time
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 配置
CONFIG = {
    "driver_path": "./chromedriver",  # 确保路径正确
    "headless": False,
    "base_url": "https://kns.cnki.net/kns8s/search",
    "search_keyword": "高温合金",
    "output_file": "material_data.csv",
    "timeout": 30,
    "element_timeout": 10,
}

# 初始化浏览器
def init_driver(config):
    try:
        driver = webdriver.Safari()
        driver.maximize_window()
        return driver
    except Exception as e:
        print(f"浏览器初始化失败: {str(e)}")
        return None

# 数据爬取
def scrape_literature_data(driver):
    data = []
    try:
        driver.get(CONFIG["base_url"])
        wait = WebDriverWait(driver, CONFIG["element_timeout"])
        
        # 搜索操作
        search_box = wait.until(EC.presence_of_element_located((By.ID, 'txt_search')))
        search_box.send_keys(CONFIG["search_keyword"])
        search_button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'search-btn')))
        search_button.click()
        
        # 等待结果加载
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.result-table-list')))
        time.sleep(2)  # 必要等待
        
        # 解析结果
        results = driver.find_elements(By.CSS_SELECTOR, '.result-table-list tr:not(:first-child)')
        print(f"找到 {len(results)} 条结果")
        
        # 采集基础数据
        for idx, result in enumerate(results[:5]):  # 测试时限制数量
            try:
                cells = result.find_elements(By.TAG_NAME, 'td')
                if len(cells) < 8: continue
                
                title_elem = cells[1].find_element(By.TAG_NAME, 'a')
                data.append({
                    'Title': title_elem.text,
                    'Link': title_elem.get_attribute('href'),
                })
            except Exception as e:
                print(f"第{idx+1}条数据解析失败: {str(e)}")
        
        # 打印原始数据
        print("爬取到的原始数据:")
        for item in data:
            print(f"文件名: {item['Title']}, 网址: {item['Link']}")
        
        return data
    except Exception as e:
        print(f"数据爬取失败: {str(e)}")
        return []

# 保存数据到CSV文件
def save_to_csv(data, filename):
    if not data:
        print("没有数据可保存")
        return
    
    try:
        with open(filename, mode='w', newline='', encoding='utf-8') as file:
            writer = csv.DictWriter(file, fieldnames=['Title', 'Link'])
            writer.writeheader()
            for item in data:
                writer.writerow(item)
        print(f"数据已成功保存到文件: {filename}")
    except Exception as e:
        print(f"保存到CSV文件失败: {str(e)}")

# 主程序
def main():
    driver = init_driver(CONFIG)
    if not driver:
        return
    
    try:
        # 数据采集
        raw_data = scrape_literature_data(driver)
        if not raw_data:
            raise ValueError("未获取到有效数据")
        
        # 保存数据到CSV文件
        save_to_csv(raw_data, CONFIG["output_file"])
    except Exception as e:
        print(f"主流程错误: {str(e)}")
    finally:
        driver.quit()

if __name__ == "__main__":
    main()

matlab:

function erlangB_exercise()
    % Main function for Erlang B exercise with GUI interface
    
    % Create main figure
    fig = figure('Name', 'Erlang AAA System Analysis', 'NumberTitle', 'off', ...
                 'Position', [100, 100, 900, 600]);
    
    % Create tabs
    tabgroup = uitabgroup(fig);
    tab1 = uitab(tabgroup, 'Title', 'Call Blocking Probability');
    tab2 = uitab(tabgroup, 'Title', 'Steady-State Probabilities');
    tab3 = uitab(tabgroup, 'Title', 'Traffic Analysis');
    
       
    % Default parameters
    default_m = [5, 10, 25, 50, 75, 100];
    default_a_min = 1;
    default_a_max = 100;
    default_ymin = 1e-3;
    default_ymax = 1;
    
    % UI controls for Tab 1
    uicontrol(tab1, 'Style', 'text', 'String', 'Number of servers (m):', ...
              'Position', [20, 500, 150, 20], 'HorizontalAlignment', 'left');
    m_edit = uicontrol(tab1, 'Style', 'edit', 'String', mat2str(default_m), ...
                       'Position', [180, 500, 200, 20]);
    
    uicontrol(tab1, 'Style', 'text', 'String', 'Offered traffic range (a):', ...
              'Position', [20, 470, 150, 20], 'HorizontalAlignment', 'left');
    a_min_edit = uicontrol(tab1, 'Style', 'edit', 'String', num2str(default_a_min), ...
                          'Position', [180, 470, 60, 20]);
    uicontrol(tab1, 'Style', 'text', 'String', 'to', ...
              'Position', [250, 470, 20, 20], 'HorizontalAlignment', 'center');
    a_max_edit = uicontrol(tab1, 'Style', 'edit', 'String', num2str(default_a_max), ...
                          'Position', [280, 470, 60, 20]);
    
    uicontrol(tab1, 'Style', 'text', 'String', 'Y-axis range:', ...
              'Position', [20, 440, 150, 20], 'HorizontalAlignment', 'left');
    ymin_edit = uicontrol(tab1, 'Style', 'edit', 'String', num2str(default_ymin), ...
                         'Position', [180, 440, 60, 20]);
    uicontrol(tab1, 'Style', 'text', 'String', 'to', ...
              'Position', [250, 440, 20, 20], 'HorizontalAlignment', 'center');
    ymax_edit = uicontrol(tab1, 'Style', 'edit', 'String', num2str(default_ymax), ...
                         'Position', [280, 440, 60, 20]);
    
    plot_button = uicontrol(tab1, 'Style', 'pushbutton', 'String', 'Plot', ...
                           'Position', [180, 400, 100, 30], ...
                           'Callback', @plot_blocking_probability);
    
    % Axes for Tab 1
    ax1 = axes(tab1, 'Position', [0.1, 0.1, 0.8, 0.3]);
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Tab 2: Steady-State Probability Distribution
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    % UI controls for Tab 2
    uicontrol(tab2, 'Style', 'text', 'String', 'Number of servers (m):', ...
              'Position', [20, 500, 150, 20], 'HorizontalAlignment', 'left');
    m2_edit = uicontrol(tab2, 'Style', 'edit', 'String', '5', ...
                       'Position', [180, 500, 60, 20]);
    
    uicontrol(tab2, 'Style', 'text', 'String', 'Offered traffic (a):', ...
              'Position', [20, 470, 150, 20], 'HorizontalAlignment', 'left');
    a2_edit = uicontrol(tab2, 'Style', 'edit', 'String', '3.75', ...
                       'Position', [180, 470, 60, 20]);
    
    plot2_button = uicontrol(tab2, 'Style', 'pushbutton', 'String', 'Plot Distribution', ...
                           'Position', [180, 400, 150, 30], ...
                           'Callback', @plot_steady_state);
    
    % Axes for Tab 2
    ax2 = axes(tab2, 'Position', [0.1, 0.1, 0.8, 0.3]);
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Tab 3: Traffic Analysis
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    % Analysis type selection
    uicontrol(tab3, 'Style', 'text', 'String', 'Analysis Type:', ...
              'Position', [20, 500, 100, 20], 'HorizontalAlignment', 'left');
    analysis_type = uicontrol(tab3, 'Style', 'popupmenu', ...
                            'String', {'Max Traffic for m and P_c', ...
                                       'Max Users for m, P_c, λ₀, 1/μ', ...
                                       'Min Servers for a and P_c'}, ...
                            'Position', [130, 500, 200, 20]);
    
    % Panel for parameters
    param_panel = uipanel(tab3, 'Title', 'Parameters', 'Position', [0.05, 0.3, 0.9, 0.2]);
    
    % Result display
    result_text = uicontrol(tab3, 'Style', 'text', 'String', 'Result will appear here', ...
                           'Position', [100, 200, 300, 50], 'FontSize', 12);
    
    calculate_button = uicontrol(tab3, 'Style', 'pushbutton', 'String', 'Calculate', ...
                               'Position', [200, 150, 100, 30], ...
                               'Callback', @calculate_traffic);
    
    % Set up parameter controls for each analysis type
    setup_parameter_controls();
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Callback Functions
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    function plot_blocking_probability(~, ~)
        % Plot Erlang B call blocking probability curves
        
        try
            m = str2num(m_edit.String);
            a_min = str2double(a_min_edit.String);
            a_max = str2double(a_max_edit.String);
            ymin = str2double(ymin_edit.String);
            ymax = str2double(ymax_edit.String);
            
            a = a_min:0.1:a_max;
            
            axes(ax1);
            cla;
            hold on;
            
            colors = lines(length(m));
            for i = 1:length(m)
                Pc = arrayfun(@(x) erlang_b(x, m(i)), a);
                semilogy(a, Pc, 'Color', colors(i,:), 'LineWidth', 2, ...
                         'DisplayName', sprintf('m = %d', m(i)));
            end
            
            set(gca, 'YScale', 'log');
            ylim([ymin, ymax]);
            xlabel('Offered Traffic (a)');
            ylabel('Call Blocking Probability (P_c)');
            title('Erlang B Call Blocking Probability');
            legend('show', 'Location', 'northeast');
            grid on;
            hold off;
            
        catch ME
            errordlg(sprintf('Error: %s', ME.message), 'Plot Error');
        end
    end

    function plot_steady_state(~, ~)
        % Plot steady-state probability distribution
        
        try
            m = str2double(m2_edit.String);
            a = str2double(a2_edit.String);
            
            % Calculate steady-state probabilities
            P0 = 1 / sum(arrayfun(@(k) a^k / factorial(k), 0:m));
            Pk = arrayfun(@(k) (a^k / factorial(k)) * P0, 0:m);
            
            axes(ax2);
            cla;
            bar(0:m, Pk);
            
            % Add text labels
            for k = 0:m
                text(k, Pk(k+1), sprintf('%.4f', Pk(k+1)), ...
                     'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom');
            end
            
            xlabel('Number of busy servers (k)');
            ylabel('Probability P_k');
            title(sprintf('Steady-State Probability Distribution (m=%d, a=%.2f)', m, a));
            grid on;
            
        catch ME
            errordlg(sprintf('Error: %s', ME.message), 'Plot Error');
        end
    end

    function calculate_traffic(~, ~)
        % Perform traffic analysis based on selected type
        
        type = analysis_type.Value;
        
        try
            switch type
                case 1 % Max Traffic for m and P_c
                    m = str2double(get_param_control(1).String);
                    Pc = str2double(get_param_control(2).String);
                    
                    % Find maximum a that satisfies Pc >= ErlangB(a,m)
                    a_max = fzero(@(a) erlang_b(a, m) - Pc, [0.1, m*10]);
                    
                    set(result_text, 'String', sprintf('Maximum Traffic (a): %.4f', a_max));
                    
                case 2 % Max Users for m, P_c, λ₀, 1/μ
                    m = str2double(get_param_control(1).String);
                    Pc = str2double(get_param_control(2).String);
                    lambda0 = str2double(get_param_control(3).String);
                    inv_mu = str2double(get_param_control(4).String);
                    
                    % Find maximum N where a = λ₀*N/μ and Pc >= ErlangB(a,m)
                    fun = @(N) erlang_b(lambda0 * N * inv_mu, m) - Pc;
                    N_max = floor(fzero(fun, [0.1, m*10/lambda0/inv_mu]));
                    
                    set(result_text, 'String', sprintf('Maximum Users (N): %d', N_max));
                    
                case 3 % Min Servers for a and P_c
                    a = str2double(get_param_control(1).String);
                    Pc = str2double(get_param_control(2).String);
                    
                    % Find minimum m where Pc >= ErlangB(a,m)
                    m_min = 1;
                    while erlang_b(a, m_min) > Pc
                        m_min = m_min + 1;
                    end
                    
                    set(result_text, 'String', sprintf('Minimum Servers (m): %d', m_min));
            end
            
        catch ME
            errordlg(sprintf('Error: %s', ME.message), 'Calculation Error');
        end
    end

    function setup_parameter_controls()
        % Set up parameter controls for each analysis type
        
        % Clear existing controls
        delete(get(param_panel, 'Children'));
        
        type = analysis_type.Value;
        
        switch type
            case 1 % Max Traffic for m and P_c
                uicontrol(param_panel, 'Style', 'text', 'String', 'Number of servers (m):', ...
                          'Position', [20, 60, 150, 20], 'HorizontalAlignment', 'left');
                uicontrol(param_panel, 'Style', 'edit', 'String', '10', ...
                          'Position', [180, 60, 60, 20], 'Tag', 'param1');
                
                uicontrol(param_panel, 'Style', 'text', 'String', 'Call blocking probability (P_c):', ...
                          'Position', [20, 30, 150, 20], 'HorizontalAlignment', 'left');
                uicontrol(param_panel, 'Style', 'edit', 'String', '0.01', ...
                          'Position', [180, 30, 60, 20], 'Tag', 'param2');
                
            case 2 % Max Users for m, P_c, λ₀, 1/μ
                uicontrol(param_panel, 'Style', 'text', 'String', 'Number of servers (m):', ...
                          'Position', [20, 90, 150, 20], 'HorizontalAlignment', 'left');
                uicontrol(param_panel, 'Style', 'edit', 'String', '10', ...
                          'Position', [180, 90, 60, 20], 'Tag', 'param1');
                
                uicontrol(param_panel, 'Style', 'text', 'String', 'Call blocking probability (P_c):', ...
                          'Position', [20, 60, 150, 20], 'HorizontalAlignment', 'left');
                uicontrol(param_panel, 'Style', 'edit', 'String', '0.01', ...
                          'Position', [180, 60, 60, 20], 'Tag', 'param2');
                
                uicontrol(param_panel, 'Style', 'text', 'String', 'Single user arrival rate (λ₀):', ...
                          'Position', [20, 30, 150, 20], 'HorizontalAlignment', 'left');
                uicontrol(param_panel, 'Style', 'edit', 'String', '0.1', ...
                          'Position', [180, 30, 60, 20], 'Tag', 'param3');
                
                uicontrol(param_panel, 'Style', 'text', 'String', 'Average service time (1/μ):', ...
                          'Position', [300, 30, 150, 20], 'HorizontalAlignment', 'left');
                uicontrol(param_panel, 'Style', 'edit', 'String', '1', ...
                          'Position', [450, 30, 60, 20], 'Tag', 'param4');
                
            case 3 % Min Servers for a and P_c
                uicontrol(param_panel, 'Style', 'text', 'String', 'Offered traffic (a):', ...
                          'Position', [20, 60, 150, 20], 'HorizontalAlignment', 'left');
                uicontrol(param_panel, 'Style', 'edit', 'String', '10', ...
                          'Position', [180, 60, 60, 20], 'Tag', 'param1');
                
                uicontrol(param_panel, 'Style', 'text', 'String', 'Call blocking probability (P_c):', ...
                          'Position', [20, 30, 150, 20], 'HorizontalAlignment', 'left');
                uicontrol(param_panel, 'Style', 'edit', 'String', '0.01', ...
                          'Position', [180, 30, 60, 20], 'Tag', 'param2');
        end
    end

    function control = get_param_control(index)
        % Helper function to get parameter control by index
        children = get(param_panel, 'Children');
        tags = get(children, 'Tag');
        control = children(strcmp(tags, sprintf('param%d', index)));
    end

    function Pc = erlang_b(a, m)
        % Calculate Erlang B formula (call blocking probability)
        % Pc = (a^m / m!) / (sum_{k=0}^m (a^k / k!))
        
        numerator = a^m / factorial(m);
        denominator = sum(arrayfun(@(k) a^k / factorial(k), 0:m));
        Pc = numerator / denominator;
    end

    % Set callback for analysis type change
    analysis_type.Callback = @(~,~) setup_parameter_controls();
    
    % Initialize parameter controls
    setup_parameter_controls();
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值