Система уравнений Matlab Solve с квантованными переменными - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь использовать решение () для решения системы уравнений следующего вида

eq1=a1x+a2y;
eq2=b1x+b2y;

, где a1 = .05 для значений x<5, .1 для значений 5

Есть ли способ решить эту проблему с помощью решения? Как в sol = solve(eq1,eq2);

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Я не уверен, что вы пытаетесь сделать здесь. Можете ли вы опубликовать реальный пример (с цифрами) и какой вы хотели бы получить результат?


Я думаю, вы пытаетесь решить линейные одновременные уравнения. Предполагая, что это то, что вы пытаетесь сделать:

Я бы предложил умножить все ваши уравнения на 20, чтобы ваш минимальный размер квантов 0.05 стал 1.00. Ваша задача становится решением линейных уравнений для целых значений.

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

1 = 2a + 4b
3 =  a +  b

имеет решение a = 5.5, b = -2.5. Другое решение невозможно.

Для систем с ограниченным доступом, т.е.

0 = 3x + y
x > 0

Тогда будет бесконечное количество решений, некоторые из которых могут иметь как x, так и y целочисленные значения. (Или не может быть целочисленных решений вообще.)

0 голосов
/ 24 мая 2018

Хорошо, позвольте мне дать вам краткое изложение.

Если вы хотите решить уравнение или систему уравнений и условий, то вам нужно определить их как таковые, поэтому позвольте мне объяснить.Итак, в качестве примера

clear all; %just to be safe
syms x y b 
a=0.5;
somevalue=1;
someothervalue=3;
eq1= a*x+a*y == somevalue; %this is your first equation
eq2= b*x+b*y == someothervalue; %this is your 2nd equation
cond1= x<5; %this is a condition which matlab sees as an "equation"
eqs=[eq1,eq2,cond1]; %these are the equations and conditions you want to solve for, use this for solve
eqs=[eq1,eq2]; %use this for vpasolve and set your condition in range
vars=[x,y,b]; %these are the variable you want to solve for
range = [-Inf 5; NaN NaN; NaN NaN]; %NaN means you set no range

%you can use solve or vpasolve, second one being numeric, which is the one you'll probably want
n=5;
sol=zeros(n,numel(vars));
for i = 1:n 
    temp1 = vpasolve(eqs, vars, range, 'random', true);
    temp = vpasolve(eqs, vars, 'random', true);
    sol(i,1) = temp.x;
    sol(i,2) = temp.y;
    sol(i,3) = temp.b;
end
sol

Теперь, когда я запускаю это сам, я не могу заставить диапазон работать по какой-то причине, все еще пытаясь понять это.Когда вы не устанавливаете диапазон, он работает просто отлично, если вы можете использовать функцию решения, то также не возникает проблем.Теоретически, функция range должна работать нормально, так что это может быть ошибкой с моей стороны.

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

...