#matlab
#matlab
Вопрос:
Выполнение приведенного ниже кода приводит к получению двух наборов решений. Для одного набора решений оба z-значения будут > = 0 (39,4962 и 0). Для другого набора решений одно z-значение будет <0 (-39.4962 и 0).
Если я включу строки «assumeAlso», которые в данный момент закомментированы, никаких решений не будет дано. Это не то, что я ожидал; Я предположил, что только второй набор решений будет дисквалифицирован, поскольку первое решение не противоречит предположениям.
Кто-нибудь может просветить меня относительно того, почему это происходит? Заранее спасибо.
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. Просто чтобы быть уверенным, не могли бы вы, пожалуйста, попробовать
assumeAlso(... >= -1e-9)
вместо>= 0
?2. К сожалению, это приводит к тем же результатам.
Ответ №1:
Вы пытаетесь решить проблему, которая имеет бесконечные решения. Другими словами, существует независимость между переменными, для которых 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)
и т.д…