Matlab 警告:可能是虚假的解决方案。[solvelib::checkSolutions]

Matlab 警告:可能是虚假的解决方案。[solvelib::checkSolutions],matlab,warnings,solution,polynomial-math,symbolic-math,Matlab,Warnings,Solution,Polynomial Math,Symbolic Math,我试图在for循环中解四个代数方程。它发出了“可能是虚假的解决方案”的警告。你能帮我弄清楚怎么把它取下来吗。代码随函附上 a=[1.78E-05 3.39E-04 0.0104 -0.05791 -16.36]; for i=1:R/l0 syms x y l r [sol_l,sol_r,sol_x,sol_y] = solve(l == (sqrt((x-x0)^2+(y-y0)^2)), r == abs((x+x0)/2),... poly2sym

我试图在for循环中解四个代数方程。它发出了“可能是虚假的解决方案”的警告。你能帮我弄清楚怎么把它取下来吗。代码随函附上

a=[1.78E-05 3.39E-04    0.0104  -0.05791    -16.36];

for i=1:R/l0
    syms x y l r
    [sol_l,sol_r,sol_x,sol_y] = solve(l == (sqrt((x-x0)^2+(y-y0)^2)), r == abs((x+x0)/2),...
    poly2sym(a) == y, l*r*t == l0*r0*t0,x,y,l,r, 'Real', true);
    for j=1:length(sol_x)
        if (sol_x(j)<0)&&(sol_x(j)>x0)
            if (sol_y(j)<0)&&(sol_y(j)<y0)
                x_req(1,i) = sol_x(j);
                y_req(1,i) = sol_y(j);
            end
        end
    end
    x0 = x_req(1,i);
    y0 = y_req(1,i);
    r0 = R-l0*(2*i-1)/2;    
   end
a=[1.78E-053.39E-040.0104-0.05791-16.36];
对于i=1:R/l0
符号x y l r
[sol_l,sol_r,sol_x,sol_y]=solve(l==(sqrt((x-x0)^2+(y-y0)^2)),r==abs((x+x0)/2),。。。
poly2sym(a)=y,l*r*t==l0*r0*t0,x,y,l,r,'Real',true);
对于j=1:长度(sol_x)
if(sol_x(j)x0)

如果(solu_y(j)将第一个等式改为此,则警告不再出现:

l^2 == (x-x0)^2+(y-y0)^2
但我不确定你是否真的有假值。可能是平方根给了
solvelib::checkSolutions
麻烦

当您检查时,您可能认为您的值是假的,因为您没有正确输出变量。您指定
solve
solve for
x
y
l
r
(按该顺序),然后将输出变量命名为
sol_l
sol_r
sol_x
sol_y
(不同顺序)。必须使用与“基于变量名称的解算无法猜测”相同的顺序

您的代码:

R=30;
x0=-R;
y0=0;
l0=R/100;
t0=1.2;
t=0.7071;
r0=R-l0/2;
a=[1.78E-05 3.39E-04 0.0104 -0.05791 -16.36];

[sol_x,sol_y,sol_l,sol_r] = solve(l^2 == (x-x0)^2+(y-y0)^2, ...
                                  r == abs((x+x0)/2), ...
                                  poly2sym(a) == y, ...
                                  l*r*t == l0*r0*t0, ...
                                  x,y,l,r, 'Real', true)
% Check
sol_l2.^2 - (sol_x2-x0).^2+(sol_y2-y0).^2
sol_r - abs((sol_x+x0)/2)
[subs(poly2sym(a),x,sol_x(1));subs(poly2sym(a),x,sol_x(2));...
 subs(poly2sym(a),x,sol_x(3));subs(poly2sym(a),x,sol_x(4))]-sol_y;
sol_l2.*sol_r2*t - l0*r0*t0

检查返回接近零的小值。

这是什么语言?请相应地标记为什么
solve
for
循环中?其中没有任何内容取决于
i
。您也不需要显示所有代码来演示问题,编辑您的问题以去除所有不相关的位。对于每个i,值x0、y0和r0正在发生变化。因此,解决方案在每次迭代后都会发生变化。我看到了,并且得到了纠正。您仍然可以在不使用所有额外代码的情况下演示该问题,从而简化和澄清您的问题。这些解决方案是否真的是虚假的?您是否检查了它们?或者您的问题只是如何禁用警告消息?一些答案是假的。你能帮我理解为什么它用l=sqrt()而不是l^2=()发出警告吗?@Ankush:
sqrt
在零处是不连续的,负值的
sqrt
是复杂的。因为
solve
使用数值方法,可能会有数值错误,这些错误可能会被
sqrt
的特性放大。这是我在这种情况下的最佳猜测。
abs
函数中的非线性这也可能导致更多的错误——或者至少使解决方案更难获得。