使用“解决”,不正确的解决方法来解决非线性方程

时间:2019-04-02 13:25:41

标签: matlab symbolic-math

我正在测试MATLAB的能力,以解决我打算做的项目的方程式,因此我用简单的方法对其进行了测试,但是结果却不正确。我试图用两个未知数求解两个非线性方程,其中一个是正确的,另一个不是。

syms theta d x y

eq1 = d * cos(theta) == x;
eq2 = d * sin(theta) == y;

sol = solve(eq1, eq2, theta, d)

sol.theta
sol.d

d的解是正确的,但是对于theta我得到了:

 -2*atan((x - (x^2 + y^2)^(1/2))/y)
 -2*atan((x + (x^2 + y^2)^(1/2))/y)

正确的答案是atan(y / x)

然后,当我用x = 1,y = 0评估这些解时,我得到:

eval(sol.d)
eval(sol.theta)

d = 1, -1
theta = NaN, -3.1416

d的解是正确的,但该情况下的theta应该为0。 我在做什么错了?

编辑:手工求解,看起来像这样:将y方程除以x方程

y/x = (d * sin(theta)) / (d * cos(theta))
y/x = sin(theta)/cos(theta)
y/x = tan(theta)
theta = atan(y/x)

即使matlab以其他方式解决它并获得不同的表达式,当我使用数字时,它仍然应该产生相同的最终结果,而部分地。

对于x = 1和y = 0,theta应该为0,=>这不起作用,它给出NaN(波纹管)

对于x = 1和y = 1,theta应该为45度=>可行

对于x = 0和y = 1 theta应该为90度=>可以实现

我只是再次使用x和y的45度和90度值对其进行了检查,并且可以工作,但是对于x = 1和y = 0,它仍然给出NaN作为答案之一,那是因为它得到0 / 0表示方式

-2*atan((x - (x^2 + y^2)^(1/2))/y)
-2*(1 - (1^2 + 0^2))^(1/2)/0 
-2*(1 - 1)^(1/2)/0 
0/0

但如果其形式为atan(y / x),则结果为

theta = atan(0/1) 
theta = atan(0)
theta = 0 

2 个答案:

答案 0 :(得分:0)

您是要解决这个问题吗?

syms a b theta d real

eq1 = a==d * cos(theta) ;
eq2 = b==d * sin(theta) ;

[sol] = solve([eq1 eq2],[d theta] ,'IgnoreAnalyticConstraints', true,'Real',true,'ReturnConditions',true);

答案 1 :(得分:0)

当使用符号xy求解方程时,求解器将找到具有特定条件的解决方案,可以使用参数'ReturnCondition'来获得该解决方案:

syms x y theta d real

eq1 = d*cos(theta) == x;
eq2 = d*sin(theta) == y;

sol = solve([eq1; eq2],[d theta],'ReturnConditions',true);

这为sol

提供了以下结果
>> sol.d
  (x^2 + y^2)^(1/2)
 -(x^2 + y^2)^(1/2)

>> sol.theta
  2*pi*k - 2*atan((x - (x^2 + y^2)^(1/2))/y)
  2*pi*k - 2*atan((x + (x^2 + y^2)^(1/2))/y)

>> sol.parameters
  k

>> sol.conditions
  y ~= 0 & in(k, 'integer')
  y ~= 0 & in(k, 'integer')

如您所见,y = 0无法满足求解器给出的一般解决方案,从而导致y = 0的问题。您可以通过将y设为数字而不是数字来找到y = 0的解决方案象征性的,或添加一个假设:

syms x y theta d real
assume(y==0)
sol = solve([eq1; eq2],[d theta],'ReturnConditions',true);

对于这种情况,我认为仅将y = 0设置为数字就容易了,因为上面的三行已经有4种可能的解决方案和条件。