在 MATLAB 中求解非线性方程组
Solving non-linear system of equations in MATLAB
我遇到了一个必须求解的非线性方程组。
方程组可以写成:
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))
你可以使用 Newton-Raphson。将您的系统重新安排为零残差:
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
当然,您可以通过在残差足够小后停止迭代来使其更智能。
我刚看到这是一个十字架post。
这是我针对 other posting 的解决方案:
函数可以写成这样的形式:
$$ f \left( x \right) = A x + \exp \left( x \right) - b $$
只要找到$f\left(x\right)$的根就等同于上面的
可以使用 Newton's Method 求根。
$f\left(x\right)$的Jacobian(类似梯度的转置)由下式给出:
$$ 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) $$
您可以在我的 Mathematics Q1462386 GitHub Repository 中查看代码,其中包括雅可比行列式的解析和数值推导。
这是一个运行的结果:
请注意,虽然它找到了这个问题的根,但有不止一个根,因此解决方案是众多解决方案中的一个,并且取决于初始点。
我遇到了一个必须求解的非线性方程组。
方程组可以写成:
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))
你可以使用 Newton-Raphson。将您的系统重新安排为零残差:
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
当然,您可以通过在残差足够小后停止迭代来使其更智能。
我刚看到这是一个十字架post。
这是我针对 other posting 的解决方案:
函数可以写成这样的形式:
$$ f \left( x \right) = A x + \exp \left( x \right) - b $$
只要找到$f\left(x\right)$的根就等同于上面的
可以使用 Newton's Method 求根。
$f\left(x\right)$的Jacobian(类似梯度的转置)由下式给出:
$$ 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) $$
您可以在我的 Mathematics Q1462386 GitHub Repository 中查看代码,其中包括雅可比行列式的解析和数值推导。
这是一个运行的结果:
请注意,虽然它找到了这个问题的根,但有不止一个根,因此解决方案是众多解决方案中的一个,并且取决于初始点。