Простым решением является использование инструмента, предназначенного для его решения. То есть используйте lsqlin из панели инструментов оптимизации. Установите ограничение нижней границы для двух из трех параметров.
Таким образом, предполагая, что x, y и z - все векторы COLUMN,
A = [единицы (длина (x), 1), x, y];
фунт = [-inf, 0, 0];
a = lsqlin (A, z, [], [], [], [], lb);
Это ограничит только второй и третий неизвестные параметры.
Без набора инструментов оптимизации используйте lsqnonneg, который является частью самого matlab. Здесь также достаточно простое решение.
A = [единицы (длина (x), 1), x, y];
a = lsqnonneg (A, z);
Ваша модель будет
z = a (1) + a (2) * x + a (3) * y
Если a (1) по существу равно нулю, то есть находится в пределах допуска, равного нулю, то предположим, что первый параметр был ограничен границей в нуле. В этом случае решите вторую проблему, изменив знак в столбце единиц в A.
A (:, 1) = -1;
a = lsqnonneg (A, z);
Если это решение имеет (1) существенно ненулевое значение, то второе решение должно быть лучше первого. Ваша модель теперь будет
z = -a (1) + a (2) * x + a (3) * y
Это стоит не более двух звонков в lsqnonneg, и второй звонок совершается только в некоторой доле (при отсутствии какой-либо информации о вашей проблеме шансы составляют 50% второго звонка) времени.