Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя
Показано с 11 по 20 из 42

Тема: Линейная Интерполяция в пр200

  1. #11

    По умолчанию

    Цитата Сообщение от Андрей 77 Посмотреть сообщение
    А какой точнее макрос линейно кусочный или линейны?
    В смысле точней? Если у Вас линейная зависимость на всем диапазоне, достаточно линейной. Если же зависимость нелинейная, и нельзя ( или очень сложно) описать математически , то макрос PLA поможет сделать это насколько возможно точно с помощью 10 точек, между двумя соседними точками будет линейная зависимость, между двумя другими тоже, но с другим коэффициентом.

  2. #12

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Вот вариант на неограниченное количество точек, в первую очередь нужно установленный на ПК или где то еще python, далее запустить представленный ниже код (возможно несколько раз, чем ближе к единице тем лучше)
    Код:
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    from pathlib import Path
    from sklearn.neural_network import MLPRegressor
    from sklearn.linear_model import LinearRegression
    import warnings
    
    warnings.simplefilter(action='ignore', category=UserWarning)
    def create_RELU_model():
        return MLPRegressor(
        hidden_layer_sizes=(4,),
        max_iter=2600000,
        solver='lbfgs',
        activation='relu',
        alpha=0.000001,
        early_stopping=True)
    
    def addRows(dataframe, beginer, num):
        mX = dataframe[['gaz']][num:(num+2)]
        mY = dataframe[['voz']][num:(num+2)]
        lr = LinearRegression().fit(mX, mY)
        for x in np.arange(mX.iloc[-1]['gaz'],mX.iloc[0]['gaz'],0.01):
            beginer.loc[len(beginer)] = [x,lr.predict([[x]])[0][0]]
    
    stuff_uno = [20., 25., 30., 35.]    # ввод табличных входных данных
    tnar = pd.DataFrame(stuff_uno).rename(columns = {0:'gaz'})
    stuff_duo = [10., 15., 20., 25.,]   # ввод табличных результирующих данных
    tkot = pd.DataFrame(stuff_duo).rename(columns = {0:'voz'})
    frames =  [tnar,tkot]
    df = pd.concat(frames, join = 'inner', axis = 1)
    bgn = df.copy()
    for idx in range(0,len(stuff_uno)-1):
        addRows(df,bgn, idx)
    
    df = bgn.sort_values(by=['gaz'])
    X = np.array(df['gaz']).reshape(-1,1)
    y = df['voz'].values.ravel()
    
    mlp = create_RELU_model()
    mlp.fit(X,y)
    ref = mlp.score(X,y)
    print('MLP SCORE: ', ref)
    
    fig, ax = plt.subplots()
    X2 = np.arange(15.,40.,0.2).reshape(-1,1) # проверка за пределами диапазона
    y2 = mlp.predict(X2)
    ax.plot(X2, y2, label="mlp_relu")
    ax.plot(X, y, label="table")
    plt.legend()
    plt.show()
    
    w0_0 = mlp.coefs_[0][0][0]
    w1_0 = mlp.coefs_[0][0][1]
    w2_0 = mlp.coefs_[0][0][2]
    w3_0 = mlp.coefs_[0][0][3]
    b0_0 = mlp.intercepts_[0][0]
    b0_1 = mlp.intercepts_[0][1]
    b0_2 = mlp.intercepts_[0][2]
    b0_3 = mlp.intercepts_[0][3]
    o0_0 = mlp.coefs_[1][0][0]
    o0_1 = mlp.coefs_[1][1][0]
    o0_2 = mlp.coefs_[1][2][0]
    o0_3 = mlp.coefs_[1][3][0]
    b1_0 = mlp.intercepts_[1][0]
    stroke=f"""function mlp_scale: real;
        var_input
            CURR : real;
        end_var
        
        var
          BUF1 : Real;
          BUF2 : Real;
          BUF3 : Real;
          BUF4 : Real;
          W1 : Real := {w0_0};
          W2 : Real := {w1_0};
          W3 : Real := {w2_0};
          W4 : Real := {w3_0};
          B1 : Real := {b0_0};
          B2 : Real := {b0_1};
          B3 : Real := {b0_2};
          B4 : Real := {b0_3};
          WO1 : Real := {o0_0};
          WO2 : Real := {o0_1};
          WO3 : Real := {o0_2};
          WO4 : Real := {o0_3};
          BO1 : Real := {b1_0};
        end_var
        
        BUF1 := math_MAX(CURR * W1 + B1, 0.0);
        BUF2 := math_MAX(CURR * W2 + B2, 0.0);
        BUF3 := math_MAX(CURR * W3 + B3, 0.0);
        BUF4 := math_MAX(CURR * W4 + B4, 0.0);
        mlp_scale := BO1 + BUF1 * WO1 + BUF2 * WO2 + BUF3 * WO3 + BUF4 * WO4;
    end_function
    """
    with open("mlp_scale.scl","w+") as f:
        f.writelines(stroke)
    созданный файл mlp_scale.scl текст скопировать и перенести в ОЛ заменив новую созданную функцию, получится такой результат, как во вложении.
    Всё же чаще кусочно-линейная интерполяция нужна для изменяемых входных данных, а вот для расчётов по каким-либо табличным справочникам наверное неплохая штука

  3. #13

    По умолчанию

    Очень полезная вещь. Много применений найти можно. И с десятью то точками , вполне себе, для многих задач хватает. С бОльшим количеством точность можно довести наверное до максимума, калибруй- не ленись только, таблицу заполнять.)

  4. #14

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ни чего не понял, ну вот например у меня бочки заполняются опустошаются это считается изменяемые входные данные с датчика уровня? Я беру тарирую емкость наливая условные сто литров и делаю замер показаний датчика, в итоге набрав до верха у меня получается таблица, я занес эту таблицу в подобный код и функция показывает мне текущее значение в зависимости от показания датчика. Также и с погодозависимыми графиками
    Даже для погодозависимого графика иногда требуется скорректировать значение температуры точки, а тут разговор про график соотношения на горелке, который точно периодически корректируется

  5. #15

    По умолчанию

    Может такое подойдет
    Вложения Вложения

  6. #16

    По умолчанию

    Цитата Сообщение от RfSS Посмотреть сообщение
    Может такое подойдет
    Что за формат файла чем открыть?

  7. #17
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,138

    По умолчанию

    Цитата Сообщение от Андрей 77 Посмотреть сообщение
    Что за формат файла чем открыть?
    Это макрос. Открывается из лоджика через меню - импортировать из файла

  8. #18

    По умолчанию

    Цитата Сообщение от Сергей0308 Посмотреть сообщение
    В менеджере компонентов есть такой макрос:

    Вложение 71676
    Читал информацию по этому блоку.И не до конца понял как он работает.Я правильно понимаю что нам нужно отмасштабировать аналоговый вход допустим.Допустим у меня есть датчик -125 125 Па токовый сигнал 4-20 ма.Получается при нуле 12ма.Значить я масштабирую аналоговый вход пр 200. Далее беру этот макрос SCALE на вход IN подаю сигнал с аналогового входа.Прописываю уст MAX_IN 125 MIN_IN -125 а на вход MAX_Q подаю 1 а на MIN_Q 0 и выход блока Q подаю на аналоговый выход, этот выход будет мне масштабировать значения аналогового датчика в токовый сигнал 4-20 ма на выходе но там будет допустим на выходе блока Q =0,5, 0,25 и так далее а выход будет уже 4-20ма так я понимаю работу данного макроса?

  9. #19

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Это макрос. Открывается из лоджика через меню - импортировать из файла
    У меня не видит лоджик это расширение.

  10. #20
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,138

    По умолчанию

    Цитата Сообщение от Андрей 77 Посмотреть сообщение
    У меня не видит лоджик это расширение.
    Версия лоджика дожна быть 2.х

Страница 2 из 5 ПерваяПервая 1234 ... ПоследняяПоследняя

Похожие темы

  1. ФБ "Кусочно-линейная функция", вопрос
    от Bulat в разделе Master SCADA 3
    Ответов: 6
    Последнее сообщение: 20.12.2022, 10:43
  2. ПР200 + ПР200 вместо пр200 + ПРМ
    от 301 в разделе Программируемые реле
    Ответов: 11
    Последнее сообщение: 22.06.2019, 10:14
  3. ПР200 + ПР200 (или МВ110, МУ110)
    от antonlis в разделе Программируемые реле
    Ответов: 32
    Последнее сообщение: 27.06.2017, 12:07
  4. ПР200 Пропадание связи USB - ПР200. Решено
    от PGK в разделе Программируемые реле
    Ответов: 0
    Последнее сообщение: 18.01.2017, 11:37
  5. ПР200+НПТ1 Пределы измерения ПР200 в режиме 4-20ma
    от Алексей Геннадьевич в разделе Программируемые реле
    Ответов: 13
    Последнее сообщение: 06.04.2016, 20:19

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •