我遇到了必须解决的非线性方程组。
方程组可以写成:
Ax + exp(x) = b
b
已知Nx1
矩阵,A
已知NxN
矩阵,x
未知Nx1
向量必须解决。 exp
在x
向量上以元素方式定义。我试图搜索MATLAB手册,但我很难找到如何用MATLAB解决这种方程式,所以我希望有人可以帮助我。
答案 0 :(得分:4)
你可以使用Newton-Raphson。将您的系统重新安排为零残差:
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
然后迭代。示例如下所示:
<div id="skill">
<div><span class="bar nrml"></span>
<span class="bar moderate"></span><span class="bar severe"></span>
</div>
当然,你可以通过在残差足够小之后停止迭代来使这更加智能化。
答案 1 :(得分:1)
我将以线性化系统[A+1]x(0)=b-1
的解决方案作为初始猜测迭代地解决它,其中1是单位矩阵。在迭代过程的每一步,我都会在右侧添加前一个解决方案的指数:Ax(j)=b-exp(x(j-1))
答案 2 :(得分:0)
我刚看到这是一个交叉帖子。
这是我对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中看到代码,其中包括雅可比行列式的分析和数值推导。
这是一次运行的结果:
注意虽然它找到了这个问题的根,但是有超过1个根,因此解决方案是其中之一,取决于初始点。