我正在尝试解决这个问题:
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]
想法?
答案 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])
它更清晰,更清洁。此外,它有效:)
它之所以有效是因为您在分配之前尚未将a
,b
,c
,d
和e
声明为global
他们的价值观。然后尝试在函数中导入它们,但那时它们仍未定义为global
,因此MATLAB认为您刚刚初始化了一堆global
s,将它们的初始值设置为空([]
)。
空方程的解是初始值(我马上承认,这有点违反直觉)。
所以这个等式涉及一些平方反比定律......重力?电动力学
请注意,根据a-e
的值,可能有多个解决方案;看到这个数字:
解是那些点[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))))]