【问题标题】:Warning: Possibly spurious solutions. [solvelib::checkSolutions]警告:可能是虚假的解决方案。 [solvelib::checkSolutions]
【发布时间】:2014-02-12 15:59:34
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 这是什么语言?请相应地标记
  • 为什么solvefor 循环内?其中没有任何内容取决于i。您也不需要显示所有代码来演示问题,编辑您的问题以去除所有不相关的部分。
  • 对于每个 i,x0、y0 和 r0 的值都在变化。所以每次迭代后解决方案都会改变。
  • 我看到并纠正了。您仍然可以在没有所有额外代码的情况下演示该问题,从而简化和澄清您的问题。这些解决方案实际上是虚假的吗?你检查过它们吗?还是您的问题仅仅是如何禁用警告消息?
  • 有些解决方案是假的

标签: matlab warnings solution polynomial-math symbolic-math


【解决方案1】:

如果您将第一个等式更改为此,警告将不再出现:

l^2 == (x-x0)^2+(y-y0)^2

我不确定您是否真的有虚假值。平方根有可能给solvelib::checkSolutions 带来麻烦。

您可能在检查时认为您有虚假值,因为您没有正确输出变量。您指定 solve 求解 xylr(按此顺序),然​​后将输出变量命名为 sol_lsol_rsol_x、@ 987654331@(不同顺序)。您必须使用与 `solve 无法根据变量名称猜测基础的顺序相同的顺序。

您的代码:

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

检查返回接近零的小值。

【讨论】:

  • 你能帮我理解为什么它用 l=sqrt () 而不是 l^2=() 发出警告吗?
  • @Ankush:sqrt 在零处不连续,而负值的sqrt 很复杂。因为solve 使用的是数值方法,所以可能存在数值错误,这些错误可能会被sqrt 的特性放大。在这种情况下,这是我最好的猜测。 abs 函数中的非线性也可能导致更多错误——或者至少使解决方案更难获得。
猜你喜欢
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-26
  • 1970-01-01
相关资源
最近更新 更多