在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
,是的。