Matlab - Почему включение положительного предположения дисквалифицирует положительные ответы? - PullRequest
5 голосов
/ 27 марта 2019

Запуск приведенного ниже кода приводит к двум наборам решений. Для одного набора решений оба значения z будут> = 0 (39,4962 и 0). Для другого набора решений одно значение z будет <0 (-39,4962 и 0). </p>

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

Может ли кто-нибудь просветить меня, почему это происходит? Заранее спасибо.

points = [0.368,0.02,2.3 ; -0.536,-0.108,2.3];
d = 40;

syms x1 y1 z1 x2 y2 z2 real


% assumeAlso(z1 >= 0)
% assumeAlso(z2 >= 0)


% Conditions L1 must satisfy
line1 = [
    x1/points(1,1) == y1/points(1,2)
    y1/points(1,2) == z1/points(1,3)
];

% Conditions L2 must satisfy
line2 = [
    x2/points(2,1) == y2/points(2,2)
    y2/points(2,2) == z2/points(2,3)
];


distance = [
    ( (x1-x2).^2 + (y1-y2).^2 + (z1-z2).^2 ) == d.^2
];

solved = solve([line1,line2,distance],[x1,y1,z1,x2,y2,z2]);


disp([ 
eval([solved.x1 solved.y1 solved.z1])
eval([solved.x2 solved.y2 solved.z2])
])

1 Ответ

2 голосов
/ 28 марта 2019

Вы пытаетесь решить проблему, которая имеет бесконечные решения.Другими словами, существует зависимость между переменными x1 y1 z1 x2 y2 z2, для которых вы решаете.Похоже, что решатель находит эту независимость только при ограничении переменной (и сбивает с толку, так что выводит только конечное число решений, если вы этого не сделаете): вы обнаружите, что получаете то же предупреждение, даже если указали что-то глупое, например

assumeAlso(z1>=-inf)
assumeAlso(z2>=-inf)

Ограничение неравенство , подобное assumeAlso(z1>=0), не удаляет независимость.Вместо этого наложение ограничения равенство , например assumeAlso(z2==0), решит проблему.Затем вы можете указать assumeAlso(z1>=0), чтобы найти конкретное решение, которое вы ищете.То есть укажите:

assumeAlso(z1>=0)
assumeAlso(z2==0)

Однако обратите внимание, что, например, вы найдете другое возможное решение для ограничения assumeAlso(z2==1) или даже assumeAlso(z2==2*z1) и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...