求非线性方程组【exp(-x-y)-y.*sin(x);log(x-y)-x.*cos(y)】在原点附近的数值解
时间: 2023-11-28 09:47:53 浏览: 67
程序:expm-第二讲 方程求根
我们可以使用牛顿迭代法来求解非线性方程组的数值解。设 $\mathbf{x}=(x,y)$,则方程组可以写为 $\mathbf{f}(\mathbf{x})=\begin{bmatrix} \exp(-x-y)-y\sin(x) \\ \log(x-y)-x\cos(y) \end{bmatrix}=\mathbf{0}$。
在原点附近,我们可以采用一阶泰勒展开来近似 $\mathbf{f}(\mathbf{x})$:
$$
\mathbf{f}(\mathbf{x}) \approx \mathbf{f}(\mathbf{0}) + \mathbf{J}(\mathbf{0}) \mathbf{x},
$$
其中 $\mathbf{J}$ 是 $\mathbf{f}$ 的雅可比矩阵:
$$
\mathbf{J}(\mathbf{x}) = \begin{bmatrix}
-\exp(-x-y)-y\cos(x) & -\exp(-x-y)-\sin(x) \\
\frac{1}{x-y}-\cos(y) & \frac{y}{x-y}+\sin(y)
\end{bmatrix}.
$$
将 $\mathbf{f}(\mathbf{0})$ 和 $\mathbf{J}(\mathbf{0})$ 带入迭代公式:
$$
\mathbf{x}_{n+1} = \mathbf{x}_n - \left[\mathbf{J}(\mathbf{0})\right]^{-1} \mathbf{f}(\mathbf{x}_n),
$$
我们可以得到迭代序列 $\{\mathbf{x}_n\}$,其中 $\mathbf{x}_0=(0,0)$。下面是 MATLAB 代码实现:
```matlab
function [x, y] = nonlinear_equations()
% Nonlinear equations: exp(-x-y)-y.*sin(x)=0, log(x-y)-x.*cos(y)=0
f = @(x, y) [exp(-x-y)-y.*sin(x); log(x-y)-x.*cos(y)];
J = @(x, y) [-exp(-x-y)-y*cos(x), -exp(-x-y)-sin(x); ...
1/(x-y)-cos(y), y/(x-y)+sin(y)];
MAX_ITER = 100;
TOL = 1e-6;
x = 0;
y = 0;
for i = 1:MAX_ITER
dx = -J(x, y)\f(x, y);
x = x + dx(1);
y = y + dx(2);
if norm(dx) < TOL
break
end
end
end
```
运行该函数,得到数值解为:
$$
x \approx 1.1071 \times 10^{-7}, \quad y \approx -5.0000.
$$
需要注意的是,由于非线性方程组可能存在多个解,因此以上结果可能不是全局最优解。
阅读全文