在MATLAB中求解非线性方程组

时间:2015-10-03 14:12:07

标签: matlab nonlinear-functions

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

3 个答案:

答案 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中看到代码,其中包括雅可比行列式的分析和数值推导。

这是一次运行的结果:

enter image description here

注意虽然它找到了这个问题的根,但是有超过1个根,因此解决方案是其中之一,取决于初始点。