Matlab:Fsolve提供错误的根

时间:2013-06-10 18:16:44

标签: matlab debugging

我正在尝试解决这个问题:

x = a + e(c - e*x/((x^2+y^2)^(3/2)))
y = b + c(d - e*y/((x^2+y^2)^(3/2)))

我正在使用fsolve,但无论我把它作为迭代的起点,我得到的答案是起点是等式的根。

close all, clear all, clc

a = 1;
b = 2;
c = 3;
d = 4;
e = 5;

fsolve(@u1FsolveFUNC, [1,2])

功能:

function outvar = u1FsolveFUNC(invar)

    global a b c d e

    outvar = [...
        -invar(1) + a + e*(c - e*(invar(1) / ((invar(1)^2 + invar(2)^2)^(3/2)))) ; 
        -invar(2) + b + e*(d - e*(invar(2) / ((invar(1)^2 + invar(2)^2)^(3/2))))]

end

我可以尝试使用[1,2]作为不变量,并且它会说这是等式的根,尽管[1,2]的正确答案是[12.76,15.52]

想法?

2 个答案:

答案 0 :(得分:2)

如果你像这样编写你的脚本

a = 1;
b = 2;
c = 3;
d = 4;
e = 5;

f = @(XY) [...
        -XY(1) + a + e*(c - e*(XY(1) ./ (XY(1).^2 + XY(2).^2).^(3/2))) 
        -XY(2) + b + e*(d - e*(XY(2) ./ (XY(1).^2 + XY(2).^2).^(3/2)))];

fsolve(f, [1,2])

它更清晰,更清洁。此外,它有效:)

它之所以有效是因为您在分配之前尚未将abcde声明为global他们的价值观。然后尝试在函数中导入它们,但那时它们仍未定义为global,因此MATLAB认为您刚刚初始化了一堆global s,将它们的初始值设置为空([])。

空方程的解是初始值(我马上承认,这有点违反直觉)。

所以这个等式涉及一些平方反比定律......重力?电动力学

请注意,根据a-e的值,可能有多个解决方案;看到这个数字:

enter image description here

解是那些点[X,Y],其中Z同时为零。对于你给出的值,有一点像

那样
[X,Y] = [15.958213798693690  13.978039302961506]

但也在

[X,Y] = [0.553696225634946   0.789264790080377]

(可能还有更多......)

答案 1 :(得分:1)

当您使用global命令时,您必须使用该命令以及每个函数(和主工作区)中的所有变量。

例如

主要脚本

global a b c d e % Note
a = 1; b = 2; c = 3; d = 4; e = 5;   
fsolve(@u1FsolveFUNC,[1,2])

<强>功能

function outvar = u1FsolveFUNC(invar)
global a b c d e % Note
outvar = [-invar(1) + a + e*(c - e*(invar(1) / ((invar(1)^2 + invar(2)^2)^(3/2)))) ; -invar(2) + b + e*(d - e*(invar(2) / ((invar(1)^2 + invar(2)^2)^(3/2))))]