• Регистрация
lmihael
lmihael +3.00
н/д

Проблемы с переменными в lsqnonlin

21.12.2022
Есть массив экспериментальных данных (9 спектров при разных концентрациях), который я пытаюсь описать спектрами нескольких форм (в данном примере для упрощения только одна форма со спектром x(2,: ) и...

Есть массив экспериментальных данных (9 спектров при разных концентрациях), который я пытаюсь описать спектрами нескольких форм (в данном примере для упрощения только одна форма со спектром x(2,: ) и соответственно 9-тью концентрациями x(1,1:9)).
Aopt=bsxfun(@times,e1,c1');
Почему-то возникает ошибка "Index exceeds matrix dimensions." Программа не видит второй строки x. x для нее почему-то массив (1,19).

clear all;
A0=0.4342/57600;
Aexp=[0.2308, 0.1665, 0.1571,  0.1615,  0.1673, 0.1857, 0.1829, 0.1483, 0.1184, 0.1341,  0.1815,  0.2444,  0.2718,   0.2192,   0.1206,  0.04647,  0.01343,  0.002997,  0.000549; 0.2364, 0.1808, 0.1463,  0.1441,  0.1647, 0.2021, 0.2236, 0.1973, 0.1453, 0.1251,  0.1438,  0.1787,  0.1876,   0.1429,  0.07636,  0.02988, 0.008849,  0.002271,  0.000398; 0.2374, 0.1901, 0.1414,  0.1317,  0.1593, 0.2084, 0.2485,  0.235, 0.1723, 0.1245,  0.1175,  0.1311,  0.1313,  0.09679,  0.05072,  0.01972, 0.005783,  0.001677,  0.000574; 0.2372, 0.1946, 0.1403,  0.1269,  0.1566, 0.2102, 0.2581, 0.2511,  0.186,  0.126,  0.1069,  0.1106,  0.1077,  0.07849,  0.04077,  0.01558, 0.004582,   0.00086,  0.000324; 0.2387, 0.1987, 0.1409,  0.1243,   0.155, 0.2112, 0.2647, 0.2628, 0.1971, 0.1288,  0.1004,  0.0973,  0.0922,   0.0664,  0.03417,  0.01324, 0.003947,   0.00089,    3.0e-5; 0.2407, 0.2063, 0.1443,   0.123,   0.155, 0.2142, 0.2744, 0.2795, 0.2154,  0.136,  0.0938, 0.08025, 0.07232,  0.05156,  0.02677,  0.01058, 0.003658,  0.001589,  0.000681; 0.2402, 0.2113, 0.1456,  0.1194,  0.1522, 0.2147, 0.2805, 0.2931, 0.2322, 0.1431, 0.08815, 0.06436, 0.05352,  0.03725,    0.019, 0.007251, 0.002433,  0.000793,  0.000741; 0.2329, 0.2133, 0.1433,  0.1106,  0.1442, 0.2111, 0.2839, 0.3064, 0.2503, 0.1505, 0.08091, 0.04694, 0.03351,  0.02233,  0.01121, 0.004327, 0.001695,  0.000635,  0.000517; 0.1647, 0.1992,  0.119, 0.06611, 0.09565, 0.1739, 0.2601, 0.3158,  0.283,  0.168, 0.07661, 0.02817, 0.01161, 0.005678, 0.002449, 0.000819,   3.0e-6, -0.000504, -0.000561];
x0=zeros(2,19);
%начальные концентрации:
x0(1,1:9)=[4.53e-6, 4.94e-6, 5.18e-6, 5.35e-6, 5.48e-6, 5.75e-6, 6.06e-6, 6.5e-6, 7.54e-6];
%начальный спектр:
x0(2,:)=[3.15e4, 2.52e4, 1.87e4,  1.75e4,  2.11e4,  2.76e4,  3.29e4, 3.11e4,  2.28e4, 1.65e4, 1.56e4, 1.74e4, 1.74e4, 1.28e4, 6722.0, 2611.0, 766.0, 222.0, 76.1];
 
xmin=zeros(size(x0));
xmax=zeros(size(x0));
xmax(1,1:18)=repmat(7.545e-06,1,18);
xmax(2,:)=repmat(5e+05,1,19);
 
options=optimset('TolFun', 1.0e-40);
f = @(x)(Aexp-bsxfun(@times,x(2,:),(A0-x(1,1:9)')));
[x,resnorm] = lsqnonlin(f,x0, xmin, xmax,options);

Буду благодарен как за советы по исправлению кода, так и за советы по лучшему алгоритму.
В моей системе 3 формы, с двумя неизвестными концентрациями (общая концентрация всех трех форм известна) и двумя неизвестными спектрами (спектр исходной известен).

Теги

      21.12.2022

      Комментарии

      • aBoomest
        aBoomest+942.89
        21.12.2022 20:08

        Одинак. верхние и нижние границы не допускаются

        • lmihael
          lmihael+3.00
          21.12.2022 20:59

          Спасибо большое. Я уже мозг сломал.

          Но почему же эта замечательная программа пишет "Index exceeds matrix dimensions"?!

          • aBoomest
            aBoomest+942.89
            22.12.2022 05:20

            Зачем вам xmin xmax в виде матриц? Ониж все одинаковые. Поставил просто числа. Ошибок нет. Но расчет останавливается из-за того, что нужен шаг расчета очень маленький. На счет шага тут уж важны нюансы того, что вы делаете, надо понимать задачу. 

            • lmihael
              lmihael+3.00
              22.12.2022 05:56

              Я свою программу максимально облегчил - там все разное будет. То что не сходится это нормально - оно и не должно - там будет три формы - вот там должно сойтись.

              • alextip
                alextip+46.13
                25.12.2022 19:16

                Оптимизационная функция не работает, так как приращение переменной задано меньше допуска. Поэтому до вашей ошибки даже не доходит.

              • aBoomest
                aBoomest+942.89
                22.12.2022 06:20

                Ну ттогда вам надо не весь массив ИксМакс ИксМин передавать, а конкретное нужное значение для каждого расчета.