在MATLAB中求解非线性方程组

在MATLAB中求解非线性方程组,matlab,nonlinear-functions,Matlab,Nonlinear Functions,我遇到了一个必须求解的非线性方程组。 方程组可以写成: Ax+exp(x)=b和b已知的Nx1矩阵、a已知的NxN矩阵,以及x必须求解的未知Nx1向量。exp是在x向量上按元素定义的。我试图搜索MATLAB手册,但我很难找到如何用MATLAB解这类方程,所以我希望有人能帮助我。我会从线性化系统的解开始迭代求解[a+1]x(0)=b-1作为初始猜测,其中1是单位矩阵。在迭代过程的每一步中,我都会在右边添加上一个解的指数:Ax(j)=b-exp(x(j-1))您可以使用牛顿-拉斐逊。将系统重新安排为

我遇到了一个必须求解的非线性方程组。 方程组可以写成:
Ax+exp(x)=b
b
已知的
Nx1
矩阵、
a
已知的
NxN
矩阵,以及
x
必须求解的未知
Nx1
向量。
exp
是在
x
向量上按元素定义的。我试图搜索MATLAB手册,但我很难找到如何用MATLAB解这类方程,所以我希望有人能帮助我。

我会从线性化系统的解开始迭代求解
[a+1]x(0)=b-1
作为初始猜测,其中1是单位矩阵。在迭代过程的每一步中,我都会在右边添加上一个解的指数:
Ax(j)=b-exp(x(j-1))

您可以使用牛顿-拉斐逊。将系统重新安排为零剩余:

R = A * x + exp(x) - b
然后取
R
相对于
x
的导数:

dRdx = A + diag(exp(x))
然后迭代。示例如下所示:

n = 3;

a = rand(n, n);
b = rand(n, 1);

% solve a * x + exp(x) = b for x

x = zeros(n, 1);

for itr = 1: 10
    x = x - (a + diag(exp(x))) \ (a * x + exp(x) - b);
end

当然,你可以在残差足够小的时候停止迭代,这样做会更加智能。

我刚才看到这是一篇交叉文章

这是我的解决方案:

该函数可以用以下形式编写:

$$f\left(x\right)=A x+\exp\left(x\right)-b$$

一旦找到$f\left(x\right)$的根,它就相当于上述值。
可以使用它来查找根

$f\left(x\right)$的(类似于梯度的转置)由下式给出:

$$J\left(f\left(x\right)\right)=A+diag\left(\exp\left(x\right)\right)$$

因此,牛顿迭代由下式给出:

$${x}^{k+1}={x}{k}-{J\left(f\left({x}^{k}\right)\right)}{-1}f\left({x}{k}\right)$$

您可以在我的中看到代码,其中包括雅可比矩阵的解析和数值推导

这是一次运行的结果:


请注意,当它找到这个问题的根时,有多个根,因此解决方案是众多解决方案之一,取决于初始点。

请解释,符号exp(x)是什么意思?指数作用于整个向量还是它的一些元素?啊,我的意思是,如果例如x=[1;2;3],那么exp(x)=[exp(1);exp(2);exp(3)]。因此,它分别作用于每个元素。(与传统的矩阵指数定义不同:exp(a)=1+a+a^2/2+…,这不是我想在这里做的:))您可以使用MATLAB中提供的任何优化或曲线拟合函数吗?我在您最初的帖子中解决了这个问题。这是正确的想法,但我认为你在线性化的某个地方出错了。对于您最初的猜测,您如何计算
b-1
?如果
1
是单位矩阵,这就没有意义了。泰勒级数中指数的展开计算
x
的增量
Dx
,然后执行
x=x+Dx
,如果
Dx
足够小,则停止。这避免了一些数值问题,停止准则是仿射不变的。但是,与其编写我们自己奇特的NR实现,不如使用MATLAB的
fsolve
和一个返回残差和雅可比矩阵的函数。不完全是。如果你真的想要Newton Raphson,那么你必须自己实现它,因为
fsolve
使用优化技术,这意味着它解决了类似
|F(x)^2->min
的问题,而不是
F(x)=0
。但若你们只需要解一次方程,那个么你们可能应该使用
fsolve
,是的。