2014-02-12 33 views
2

我正在嘗試解決for循環中的四個代數方程。它正在發出警告「可能是虛假的解決方案」。你能幫我弄清楚如何刪除它。代碼隨附。警告:可能是虛假的解決方案。 [solvelib :: checkSolutions]

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 
+1

這是什麼語言?請相應標記 – PinnyM

+0

爲什麼在'for'循環中'solve'?它不依賴於'我'。您不需要顯示所有代碼來證明問題,編輯您的問題以去除所有不相關的位。 – horchler

+0

對於每個i,x0,y0和r0的值都在變化。因此,每次迭代後解決方案都會改變。 – Ankush

回答

2

如果你改變你的第一個方程到這一點,警告不再作物起來:

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

我不知道你實際有虛假值雖然。有可能是平方根給了solvelib::checkSolutions麻煩。

您可能以爲在檢查時出現虛假值,因爲您沒有正確輸出變量。您指定solve解決xylr(按順序),但你命名輸出變量sol_lsol_rsol_xsol_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 

檢查返回值較小接近零。

+0

你能幫我理解爲什麼它給l = sqrt()而不是l^2 =()的警告? – Ankush

+0

@Ankush:'sqrt'在0處不連續,負值的'sqrt'很複雜。因爲'solve'使用數字方法,所以可能會有數字錯誤,並且這些可以通過'sqrt'的特性來放大。這是我在這種情況下最好的猜測。 abs函數中的非線性也可能導致更多的錯誤 - 或者至少使解決方案難以獲得。 – horchler