Проблемы с переменными в 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 формы, с двумя неизвестными концентрациями (общая концентрация всех трех форм известна) и двумя неизвестными спектрами (спектр исходной известен).
Комментарии
Одинак. верхние и нижние границы не допускаются
Спасибо большое. Я уже мозг сломал.
Но почему же эта замечательная программа пишет "Index exceeds matrix dimensions"?!
Зачем вам xmin xmax в виде матриц? Ониж все одинаковые. Поставил просто числа. Ошибок нет. Но расчет останавливается из-за того, что нужен шаг расчета очень маленький. На счет шага тут уж важны нюансы того, что вы делаете, надо понимать задачу.
Я свою программу максимально облегчил - там все разное будет. То что не сходится это нормально - оно и не должно - там будет три формы - вот там должно сойтись.
Оптимизационная функция не работает, так как приращение переменной задано меньше допуска. Поэтому до вашей ошибки даже не доходит.
Ну ттогда вам надо не весь массив ИксМакс ИксМин передавать, а конкретное нужное значение для каждого расчета.