1

我正在尝试解决这个系统:

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]

想法?

4

2 回答 2

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])

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

它之所以有效,是因为您在为它们赋值之前尚未声明ab、和to 。然后您尝试将它们导入您的函数中,但当时它们仍未定义为 be ,因此 MATLAB 认为您只是初始化了一堆s,将它们的初始值设置为空 ( )。cdeglobalglobalglobal[]

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

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

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

在此处输入图像描述

解是两个方程同时为零的[X,Y]点。Z对于您给出的值,有一个类似的点

[X,Y] = [15.958213798693690  13.978039302961506]

但也在

[X,Y] = [0.553696225634946   0.789264790080377]

(可能还有更多……)

于 2013-06-10T20:00:25.010 回答
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))))]
于 2013-06-10T18:33:16.930 回答