Цитата Сообщение от Эдуард_Н Посмотреть сообщение
Хочу библиотечный макрос График по четырем точкам (Graf_4pnt_v1.04) переделать под 10 точек, но что-то ума не хватает. Помогите.
Цитата Сообщение от Сергей0308 Посмотреть сообщение
Так, вроде, был макрос и на 10 точек и не так давно в какой-то теме это встречалось и выкладывалось, если не ошибаюсь Пётр из Минска выкладывал.
Я тоже как то думал сделать подобный макрос на 32 точки, но пока руки не дошли!
Мой макрос в базе называется PLA, но я уже на ST вариант выкладывал https://owen.ru/forum/showthread.php...l=1#post369459

график по 10 точкам, метод поиска делением интервала пополам, известный также как двоичный поиск или Дихотомия
Код:
function PLA_ST: real; //    (c) PeterA
    var_input //объявление входных переменных
        x1: real;
        x2: real;
        x3: real;
        x4: real;
        x5: real;
        x6: real;
        x7: real;
        x8: real;
        x9: real;
        x10: real;
        y1: real;
        y2: real;
        y3: real;
        y4: real;
        y5: real;
        y6: real;
        y7: real;
        y8: real;
        y9: real;
        y10: real;
        In: real;
    end_var
    
    var //объявление локальных переменных
     a:udint;    (*Начало интервала поиска*)
     b: udint;    (*Конец интервала поиска*)
     N: udint;    (*Число точек в графике*)
     i: udint;
     x: array [0..9] of real;
     y: array [0..9] of real;
    end_var
    
N:= 10;
x[0]:= x1;
x[1]:= x2;
x[2]:= x3;
x[3]:= x4;
x[4]:= x5;
x[5]:= x6;
x[6]:= x7;
x[7]:= x8;
x[8]:= x9;
x[9]:= x10;

y[0]:= y1;
y[1]:= y2;
y[2]:= y3;
y[3]:= y4;
y[4]:= y5;
y[5]:= y6;
y[6]:= y7;
y[7]:= y8;
y[8]:= y9;
y[9]:= y10;

(*Начальные значения интервала поиска*)
a:=0;
b:=N-1;

(*Обрезание графика для крайних точек*)
IF IN<=x[0] THEN
    PLA_ST:=y1;
ELSIF IN>= x[N-1] THEN
    PLA_ST:= y[N-1];
(*Теперь можно начать поиск*)
ELSE
    WHILE (b-a) <> 1 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками X(a) и Х(а+1)*)
    i:=(a+b)/2;    (*Делим интервал поиска пополам*)
    IF IN=x[i+1] THEN    (*Может нам повезло, и мы сразу нашли точку? *)
    a:=i; b:=i+1;            (*Бинго! прекращаем итераций, нечего в пустую молотить :) *)
    (*мимо :( ,тогда посмотрим в какую половину интервала попали*)
    ELSIF IN>x[i] THEN    (*Если входной сигнал больше середины интервала поиска,*)
    a:=i;                     (*то следующий поиск будем делать начиная от середины и до конца массива*)
    ELSE                    (*А если входной сигнал меньше середины интервала поиска,*)
    b:=i;                     (*то следующий поиск будем делать начиная от начала и до середины массива*)
    END_IF
(*Таким образом на каждой итерации отбрасываем из поиска заведомо ненужную половину значений
две соседние координаты X(a) и Х(а+1), меду которыми попадает входной сигнал найдем очень быстро
для 8 точек графика нужно не более 3 итераций
при 9..16 точек в графике нужно не более 4 итераций
при 17..32 точек в графике нужно не более 5 итераций
при 33..64 точек в графике нужно не более 6 итераций
при 65..128 точек в графике нужно не более 7 итераций
инфа точная - 100% ;) *)
END_WHILE;
(*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
PLA_ST:= y[b] - (x[b] - IN) * (y[b] - y[a]) / (x[b] - x[a]);
END_IF

   
end_function