我正在尝试在 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
最佳答案
如果您将第一个方程更改为此,警告将不再出现:
l^2 == (x-x0)^2+(y-y0)^2
但我不确定你是否真的有虚假值。平方根可能给 solvelib::checkSolutions
带来麻烦。
您可能认为在检查时存在虚假值,因为您没有正确输出变量。您指定 solve
求解 x
、y
、l
、r
(在该顺序),但随后将输出变量命名为 sol_l
、sol_r
、sol_x
、sol_y
(不同的顺序)。您必须使用与“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
检查返回接近于零的小值。
关于matlab - 警告:可能是虚假的解决方案。 [solvelib::checkSolutions],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21733020/