Перейти к содержанию
    

amaora

Участник
  • Постов

    785
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные amaora


  1. On 3/16/2021 at 4:04 PM, iiv said:

    не верное утверждение, гуглите на методы регуляризации, в том числе Тихоновские, и читайте мои комментарии выше.

    Видимо о чем то разном говорим. Исходная постановка задачи, есть уравнения:

    Quote

    x(i) * b = z(i)

    количество измерений i много превышает размерности векторов в уравнении. Переопределенная система, которую надо решить по критерию минимизации суммы квадратов невязок. Пусть это будет называться частным случаем регуляризации Тихонова, если так хочется.

    Quote

    sum_i || x(i) * b - z(i) ||^2 -> min

    Известно "простое" решение (1), где X и Z матрицы составленные из исходных векторов-строк x(i) и z(i).

    Quote

    b = inv(X' * X) * X' * Z

    Известно решение (2) с помощью QR разложения, блочный метод (наиболее удобная формулировка как мне кажется):

    Quote

     

    [Q, R] = qr([X Z])

    // где R = [Rx S; 0 Rz]

    b = S \ Rx

     

    В смысле потери точности при плохо обусловленной матрице X, очевидно, что выигрывает метод (2) ортогональных преобразований. Но это не главная проблема из-за которой я начал тему. Оба метода деградируют при большой размерности набора данных при любой обусловленности матрицы X. Многое зависит от реализации процедуры QR разложения в методе (2) или метода накопления матрицы X' * X в методе (1).

    * дополнительное условие задачи: нет доступа ко всем строкам X и Z одновременно, данные поступают последовательно, хранить их все негде.

     

    Анализ через SVD меня не заинтересовал, по следующим причинам:

    1) Редко встречаются плохо обусловленных задачи которые нужно решать в том виде как есть, и нет возможности набрать более информативные данные;

    2) В связи с дополнительным условием мне нужна будет процедура обновления разложения при поступлении нового измерения, как я понял это не слишком просто;

    3) Проблему большого набора данных этот метод не решает, все так же будет зависеть от реализации процедуры разложения.

     

     

  2. Это все МНК, при вычислениях неограниченной точности решение будет одно у всех методов. Уже набросал реализацию каскадного метода на C, для cholupdate использую вращения Гивенса. Всем спасибо, похоже ни кого таких задач нет.

  3. Есть исходные задачи, которые в физических терминах описаны. Там можно и нужно пытаться улучшить обусловленность при возможности, задавать наиболее информативный "зондирующий" сигнал.

     

    А есть математический абстрактный решатель задачи наименьших квадратов. Здесь численный метод от которого требуется получать решение с наименьшей методической погрешностью. Я сравнил точности нескольких методов на числах одинарной точности, для уравнений с 6-ю неизвестными (матрица th0) по 300000 измерений. Два варианта входного "зондирующего" сигнала, информативный (столбцы в матрице A не коллинеарны) и слабо информативный (столбцы матрицы A отличаются в 5-м десятичном знаке). То, что метод нормальных уравнений развалился это ожидаемо, и я не планирую подставлять подпорки и пытаться это как-то исправить. Приемлемую точность выдал только метод каскадного обновления QR.

     

    Сейчас у меня все задачи имеют хорошую обусловленность и реализован метод 2 (нормальные уравнения с компенсационным суммированием Кэхэна), точность получается приемлемая, это видно и по тесту. Но хотелось бы найти решатель на все случаи, в том числе и плохо обусловленные.

     

    В случае плохой обусловленности будут сильно влиять погрешности измерений, и для нахождения точного решения надо делать много больше измерений. Здесь и возникает проблема деградации точности численного метода при большом количестве измерений. Найти по этой теме пока ничего не получилось.

     

  4. Там полный код теста на octave раскрывается под надписью "Reveal hidden contents". Что не понятно?

    Если не обнаружится ничего лучше, то наверно сделаю (или найду готовую) реализацию на C каскадного обновления QR, пригодную для использования на cortex-m4f.

  5. У меня нет возможности хранить всю матрицу, надо аккумулировать измерения. Сделал в octave тест точности разных методов:

     

    1) Метод нормальных уравнений $b = inv(X'*X) * X'*Y$;

    2) Метод нормальных уравнений но при накоплении матриц X и Y использовался алгоритм суммирования Кэхэна;

    3) Обновление треугольной матрицы cholupdate (при этом содержимое матрицы аналогично QR разложению матрицы всех измерений [x y]);

    4) Обновление треугольной матрицы cholupdate с использование каскадирования (три уровня).

    5) QR разложение полной матрицы всех измерений;

    6) SVD разложение полной матрицы всех измерений.

     

    Spoiler
    
    #!/usr/bin/octave -q
    
    X = single(zeros(3,3));
    Y = single(zeros(3,2));
    
    Xk = single(zeros(3,3));
    Yk = single(zeros(3,2));
    
    X_rem = single(zeros(3,3));
    Y_rem = single(zeros(3,2));
    
    R = single(zeros(5,5));
    
    Rk = single(zeros(5,5));
    R1 = single(zeros(5,5));
    R2 = single(zeros(5,5));
    n1 = 0;
    n2 = 0;
    
    th0 = [1 2; 3 4; 5 6];
    
    len = 300000;
    Xfull = single(zeros(len,5));
    
    for i=1:len
    
        % informativity signal
        xt = [1 1 1] + randn(1,3) * 0.0001;
    
        % measurement (with random noise)
        yerr = randn(1,2) * 0.0;
        yt = xt * th0 + yerr;
    
        x = single(xt);
        y = single(yt);
    
        Xfull(i,:) = [x y];
    
        % -- normal equations
    
        X = X + x' * x;
        Y = Y + x' * y;
    
        % -- normal equations (with Kahan summation)
    
        X_val = x' * x;
        X_fixed = X_val - X_rem;
        X_newsum = Xk + X_fixed;
        X_rem = (X_newsum - Xk) - X_fixed;
        Xk = X_newsum;
    
        Y_val = x' * y;
        Y_fixed = Y_val - Y_rem;
        Y_newsum = Yk + Y_fixed;
        Y_rem = (Y_newsum - Yk) - Y_fixed;
        Yk = Y_newsum;
    
        % -- QR
    
        R = cholupdate(R, [x y]');
    
        % -- QR (with cascaded accumulation)
    
        R1 = cholupdate(R1, [x y]');
        n1 = n1 + 1;
    
        if n1 >= 20
            for j=1:5
                R2 = cholupdate(R2, R1(j,:)');
            end
            R1 = single(zeros(5,5));
            n1 = 0;
    
            n2 = n2 + 1;
    
            if n2 >= 30
                for j=1:5
                    Rk = cholupdate(Rk, R2(j,:)');
                end
                R2 = single(zeros(5,5));
                n2 = 0;
            end
        end
    end
    
    e_normal = norm(X \ Y - th0)
    e_kahan = norm(Xk \ Yk - th0)
    e_qr = norm(R(1:3,1:3) \ R(1:3,4:5) - th0)
    e_qr_cascaded = norm(Rk(1:3,1:3) \ Rk(1:3,4:5) - th0)
    
    [Q,R] = qr(Xfull,0);
    e_qr2 = norm(R(1:3,1:3) \ R(1:3,4:5) - th0)
    
    [U,S,V] = svd(Xfull(:,1:3),0);
    e_svd = norm(V*inv(S)*U'*Xfull(:,4:5) - th0)
                 

     

     

    Результат для хорошо обусловленной системы.

    Quote

    e_normal =    7.3149e-04
    e_kahan =    1.5232e-06
    e_qr =  0.0032038
    e_qr_cascaded =    6.5041e-06
    e_qr2 =    5.3381e-04
    e_svd =    6.2609e-04

    И для плохо обусловленной.

    Quote

    warning: matrix singular to machine precision, rcond = 1.73611e-08
    warning: called from
        lsq at line 86 column 10
    e_normal =  4.0000
    warning: matrix singular to machine precision
    warning: called from
        lsq at line 87 column 9
    e_kahan =  4.0000
    e_qr =  0.97758
    e_qr_cascaded =    1.9182e-04
    e_qr2 =  19.624
    e_svd =  26.617

     

    Точность функций разложения в octave не впечатляет.

  6. Вот здесь достаточно кратко про саму задачу, если я был непонятен.

    https://ckrisgarrett.github.io/qr.html

     

    Как я понял, то что мне нужно называется tall skinny QR, то есть QR декомпозиция "длинной матрицы" в которой гораздо больше строк чем столбцов. Но все, что мне удаётся найти по этому поводу направлено на параллельные вычисления, а не вопросы методической точности и компенсационных схем.

    https://www.cs.purdue.edu/homes/dgleich/publications/Constantine 2011 - TSQR.pdf

     

    Идея с разделением на квадратные блоки-матрицы и раздельной декомпозицией каждого куска понятна. Ожидаю, что точность будет деградировать аналогично каскадному суммированию. Но вот проблема, я использовал алгоритм Кэхэна из-за того ему не нужно держать в памяти весь массив данных а можно подавать измерения по одному, нужно лишь ещё немного памяти для остатков. Подобную схему для QR и хотелось бы найти.

  7. Делал тесты в octave. Система из 3-5 неизвестных и ~15000 измерений. Квадратно-корневой метод через QR разложение быстрее теряет точность с ростом количества измерений, чем накопление с компенсацией Кэхэна и дальнейшее решение $b = inv(X'*X) * X'*Y$.

     

    Вопрос в том, как применить какую-то компенсационную схему (подобно алгоритму Кэхэна) к QR разложению, для увеличения точности. Пока вижу возможность сделать аналог каскадного суммирования. Копим в промежуточной матрице порцию измерений, скажем 1000 измерений, затем этот кусок уже приведённый к треугольному виду "сбрасываем" в основную сумму. Так и сделаю наверно, размер порции только как-то адаптивно надо выбирать.

  8. Часто возникает необходимость что-нибудь оценивать по измерениям. Для примера, расчёт импеданса по двум осям, расчёт момента инерции, нахождение калибровочных коэффициентов аналогового датчика угла. Все это нужно делать on-line на ... пусть cortex-m4f, с ограничением на время выполнения и занимаемую память. Сейчас использую примитивную реализацию с накоплением матриц-квадратов от входных сигналов $b = inv(X'*X) * X'*Y$. Вместо вычисления обратной использую LDLT разложение и прямую-обратную подстановку. Так же для получения достаточной точности начал при накоплении матриц $X'*X$ и $X'*Y$ использовать суммирование Кэхэна.

     

    Сейчас подумал, может быть стоит перейти полностью на квадратно-корневую реализацию МНК. Хранить треугольную матрицу и делать операцию обновления (cholupdate) вместо суммирования. Не знаю нужно ли и можно ли в этом случае использовать суммирование Кэхэна. Хотелось бы получать методическую точность (для хорошо обусловленных задач) не зависящую от количества измерений и на уровне близком к машинному эпсилон. Размерности от 3 до 10-20.

     

    Какие вы используете численные реализации МНК?

  9. В основном силовом сервоприводе есть оценка или измерение момента (или силы) нагрузки. Эта оценка передаётся на сервопривод ручки управления. В ручке обычный сервопривод, но работающий по сигналу заданного момента (или силы) а не по положению. При необходимости можно в сервоприводе ручки ограничивать/ослаблять момент, скорость, имитировать вязкость или что угодно. Сигнал с положения ручки идёт на заданное положение силового сервопривода.

  10. 23 minutes ago, G-G said:

    И почему при разгоне обмотка мотора не греется, а при торможении таким же током - должна греться. Вроде просто берем и подключаем мотор к источнику "другой стороной" (переключением H-моста). С помощью ШИМ пускаем в мотор ток, например, такой же по величине, каким перед этим разгоняли мотор до данной скорости. И этим током тормозим до полной остановки. Получается, на активном сопротивлении обмоток выделится столько же тепла, сколько раньше выделилось при разгоне (т.е. ничего запредельного). Где ошибка?

    Обычно, на хорошем моторе, чтобы пустить такой же ток но в обратную сторону нужно лишь немного уменьшить подаваемое напряжение, а не подключать его другой стороной. На активном сопротивлении обмоток действительно выделиться столько же тепла при том же токе. А по питанию, в цепи постоянного тока, ток сменит знак и будет накачивать ёмкости если лишнюю энергию никуда не отводить. Резистор при этом подключается к цепи постоянного тока, а не напрямую к мотору.

  11. В SO(3) такое невозможно, определите порядок поворотов и найдёте углы. Если только приращения маленькие, то можно приближённо взять мнимые компоненты кватерниона умноженные на 2.

  12. У меня аналогичная одноранговая CAN сеть, и так же проблема с раздачей коротких адресов. Сейчас все держится на том, что ответы узлов с длинным первичным уникальным ID посылаются с недетерминированной задержкой, и перепосылаются в случае неудачи. Но я пока делал тесты только на игрушечной сети из трех устройств.

  13. А я смотрю со стороны того, что имеем сейчас step-down сделанный на LM46001 по схеме из ДШ (500 кГц, 22 мкГ), который делает 5в из диапазона 5-50в, то есть коэффициент 10:1. Он нормально работает и от 5в и от 55в, и это бывает полезно в некоторых применениях.

     

    Не понимаю, какие преимущества даёт несколько вариантов исполнения на разные входные напряжения? Почему версия рассчитанная на максимальное входное не может работать от нижнего предела с заполнением близким к 100%?

     

    2 hours ago, Plain said:

    Т.е. 12-вольтовая бортсеть даже не маловероятна, а вовсе невероятна?

    Да, сильно прижиматься к 12в не нужно, бортсеть не предполагается.

     

    Допускаю возможность ограничиться диапазоном 48-200в для случая flyback или других топологий с трансформатором, но по ним я ещё не понял ничего.

  14. Сейчас использую LM46001 для того чтобы сделать 5в ~1А из 5-50в. Можно найти несколько вариантов замены на 100в входного (LM5116, MP9486, ...), но оказывается нужно до 200в. Ввязываться в разработку источника желания нет, хочется взять готовое и надёжное. С изолированными топологиями не работал, не знаю особенностей.

     

    1) Вход: 12-200в (нижнюю границу можно подвигать, чтобы не усложнять преобразователь, изоляция не требуется);

    2) Выход: 12в +/- 0.5в ~1А;

    3) Обойтись без выводных и высоких компонентов, трансформатор плохо вписывается;

    4) Проще лучше, не хотелось бы выдумывать схему из низковольтного step-down контроллера + стартового линейного регулятора + драйвера + транзисторов.

     

    Что можно сделать? Или лучше смотреть flyback?

  15. По моим наблюдениям, чаще всего на высоких dv/dt по ёмкостной связи проходят эти импульсы в сигнальные цепи, нарисуйте паразитные конденсаторы на схеме. По измерениям использую "пружинку" заземления на щупе и отдельное (изолированное) питание осциллографа либо исследуемого устройства.

  16. 6 hours ago, __inline__ said:

    (система частиц с иерархией)

    Отдельный пул свободный блоков под каждый размер. Можно заранее их аллоцировать через malloc (когда блоки мелкие и важна локальность), а можно по мере работы пополнять пул, вместо того чтобы делать free. Когда надо alloc, то соответственно смотрим в пуле, если там пусто то уже делаем malloc.

  17. 37 minutes ago, jcxz said:

    PS: А вот спец. ключевое слово __ramfunc - оно как раз и предназначено для таких случаев, когда нужно выполнять код из ОЗУ, при нефункционирующей флешь. А значит компилятор будет это учитывать и избегать обращений из него во флешь.

    Не знаю есть ли подобное в GCC, если бы это позволило бы навязать ramfunc атрибут (сделать копию) всем используемым в функции символам, возможно было бы удобно. Но в любом случае компилятор не сможет гарантировать отсутсвие обращений к flash.

  18. Оба куска склеиваются вместе в один образ и объявляются константы содержащие размеры и адреса, чтобы можно было этот образ разделить и загрузить куда надо. Смотрите как работает загрузка .data секции (в самом обычном скрипте для запуска из flash), что передаётся в стартовый код.

     

    Можно и отдельно два бинарника собрать, если встроенный механизм загрузки не нужен и кто-то загрузить их оба.

  19. Репозиторий 1 под схемы-платы-чертежы, репозиторий 2 для кода. В первом проставлются теги (метки ревизий) соответствующие версиям ушедшим в производство, так чтобы всегда можно было найти схему-плату-чертеж для конкретного изделия. Во втором ведётся обычная разработка софта, привязки к железу на уровне контроля версий нет, вместо этого внутри самого софта есть варианты конфигураций, сборка под разные ревизии платы. Так лучше, проще собирать свежие версии софта под старые ревизии железа.

    Документация живёт вместе с софтом но пока у меня все плохо с ней.

×
×
  • Создать...