数值分析第一次作业-牛顿迭代法求解二元非线性方程组

1、问题

求解如下方程组:

\left\{ {\begin{array}{*{20}{l}} {f(x,y) = \sin (xy)\exp [ - 0.1*({x^2} + {y^2} + xy + 2x)]}\\ {(x,y) \in [ - 3,1] \times [ - 1,2]} \end{array}} \right.

2、算法

3、代码实现 

 

# *coding:utf-8 *
import math
delta = 5e-6 ;eps = 1e-6
x0 = 1;y0 = 1
er = 1;k = 0
def z(x,y):
    return math.sin(x*y)*math.exp(-0.1*(x**2+y**2+x*y+2*x))
def f(x,y):
    return y*math.cos(x*y)-0.1*(2*x+y+2)*math.sin(x*y)
def g(x,y):
    return x*math.cos(x*y)-0.1*(2*y+x)*math.sin(x*y)
def f_x(x,y):
    return -y**2*math.sin(x*y)-0.2*math.sin(x*y)-0.1*(2*x*y+y**2+2*y)* math.cos(x*y)
def f_y(x,y):
    return math.cos(x*y)-x*y*math.sin(x*y)-0.1*math.sin(x*y)-0.1*(2*x**2+x* y+2*x)*math.cos(x*y)
def g_x(x,y):
    return math.cos(x*y)-x*y*math.sin(x*y)-0.1*math.sin(x*y)-0.1*(2*y**2+x*y)*math.cos(x*y)
def g_y(x,y):
    return -x**2*math.sin(x*y)-0.2*math.sin(x*y)-0.1*(2*x*y+x**2)* math.cos(x*y)
print('使用初值为(',"{0:.1f}".format(x0),', ',"{0:.1f}".format(y0),')')
while er > 0.000000001:
    x1=x0+(f(x0,y0)*g_y(x0,y0)-g(x0,y0)*f_y(x0,y0))/(g_x(x0,y0)*f_y(x0,y0) -f_x(x0,y0)*g_y(x0,y0))
    y1=y0+(g(x0,y0)*f_x(x0,y0)-f(x0,y0)*g_x(x0,y0))/(g_x(x0,y0)*f_y(x0,y0) -f_x(x0,y0)*g_y(x0,y0))
    er=max(abs(x1-x0),abs(y1-y0))
    x0=x1;y0=y1
    k=k+1
    print('迭代次数',"{0:.0f}".format(k),',方程根的近似值为x=', "{0:.10f}".format(x1),',y =',"{0:.10f}".format(y1))
print('误差er=',"{0:.16f}".format(er))
print('方程组的根为(',"{0:.10f}".format(x1),',',"{0:.10f}".format(y1),')', "原函数极小值z=","{0:.10f}".format(z(x1, y1)))

 当初值为(1,1)时,计算结果如表1。

 此时可以得到原二元函数的极小值点为(0.9097471401,1.3180997683),极小值为0.5330808683。然而,当初值取(-1,-1)时,可以得到原二元函数的极小值点为(-1.5221370100,-0.8914954107),极小值为0.8474932827。为什么两个结果不一样呢?

 4、解决问题

当初值不同时,得到的结果完全不一样,之所以出现这样的结果的原因是因为二元函数可能存在多个极小值点或者鞍点。为了探究原二元函数的三维空间形状,用python画出原二元函数的三维图像如图1,三维图像绘制代码picture_3D.py见附录。 

 

 

根据图1,可以清晰地看到原二元函数有且只有一个极小值点。旋转矢量图可以看出原二元函数的极小值点大约在x=-1.5,y=1处,极小值大约为-1.1,如图2、图3。。

于是重新取初值为(-1.5,1),并计算结果,如表3。此时可以得到原二元函数的极小值点为(-1.5931730287,0.9721251312),极小值为-1.1330866542。

附录 

 

# *coding:utf-8 *
import numpy as np
from matplotlib import pyplot as plt
# 定义坐标轴
fig = plt.figure()
ax1 = plt.axes(projection='3d')
# 定义三维数据
xx = np.arange(-3, 1, 0.05)
yy = np.arange(-1, 2, 0.05)
x, y = np.meshgrid(xx, yy)
z = np.sin(x * y) * np.exp(-0.1 * (x ** 2 + y ** 2 + x * y + 2 * x))
# 作图
ax1.plot_surface(x, y, z, rstride=1, cstride=1, cmap='rainbow')
ax1.contour(x, y, z, stride=0.05, zdim='z', offset=-3, cmap='rainbow')  # 绘制等高线
plt.show()

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在MATLAB中,可以使用牛顿迭代法求解二元线性方程组。假设有一个二元线性方程组如下: f1(x, y) = 0 f2(x, y) = 0 使用牛顿迭代法求解该方程组的思路如下: 1. 初始化迭代的初始值x0和y0。 2. 计算方程组的雅可比矩阵Jacobian: J(x, y) = [∂f1/∂x ∂f1/∂y] [∂f2/∂x ∂f2/∂y] 3. 根据牛顿迭代法的迭代公式进行迭代,直到满足终止条件。迭代公式为: [x_i+1, y_i+1] = [x_i, y_i] - J(x_i, y_i)^(-1) * [f1(x_i, y_i), f2(x_i, y_i)] 其中,^(-1)表示矩阵的逆。 4. 对于每次迭代得到的[x_i+1, y_i+1],判断是否满足终止条件。可以选择判断迭代步长是否足够小,即计算||[x_i+1, y_i+1] - [x_i, y_i]||是否小于设置的阈值。 5. 如果满足终止条件,迭代结束,输出[x_i+1, y_i+1]作为方程组的解。如果不满足终止条件,继续进行迭代。 在MATLAB中,可以按照以上思路编写相应的代码实现牛顿迭代法求解二元线性方程组。通过设置合适的初始值和终止条件,可以得到该方程组的数值解。 ### 回答2: 牛顿迭代法是一种迭代逼近法,用于求解线性方程的根。而对于二元线性方程组求解,则可以将其转化为一个线性方程的求解问题。 先设定初始解向量x0,然后使用牛顿迭代公式来不断更新该解向量,直到收敛于方程组的解。具体的迭代公式如下: x(k+1) = x(k) - (Jf(x(k)))^(-1) * f(x(k)) 其中,k表示迭代次数,x(k)为第k次迭代得到的解向量,Jf(x(k))为方程组在x(k)处的雅可比矩阵,f(x(k))为方程组的函数向量。该雅可比矩阵可以通过对方程组的偏导数计算得到。 具体实现时,可以使用MATLAB的代码来进行计算。首先,需要设置初始解向量x0,然后通过循环的方式进行迭代计算,直到满足停止迭代的条件(例如,设定一个迭代次数上限或者两次迭代解之间的差异小于一个阈值)。在每次迭代中,需要计算雅可比矩阵和函数向量,并更新解向量。 需要注意的是,迭代法的收敛性及效率与初始解向量的选取有关。因此,初始解向量的选取应尽量靠近方程组的解,以提高收敛速度。此外,当方程组的解存在多个时,可能会有多个极值点。因此,迭代法可能收敛于局部极值而不是全局极值。在实际应用中,需要对方程组的性质和问题的要求进行综合考虑来选择合适的算法。 ### 回答3: Matlab是一种强大的数值计算软件,可以使用它来实现牛顿迭代法求解二元线性方程组牛顿迭代法是基于函数的不动点理论,用于求解线性方程组的数值算法。对于二元线性方程组,我们可将其表示为如下形式: f1(x, y) = 0 f2(x, y) = 0 其中f1(x, y)和f2(x, y)是关于未知数x和y的函数。牛顿迭代法的基本思想是,选择一个初始解(x0, y0),然后通过迭代逼近方程组的解。具体的迭代公式如下: x(k+1) = x(k) - J^(-1)(x(k), y(k)) * [f1(x(k), y(k)); f2(x(k), y(k))] y(k+1) = y(k) - J^(-1)(x(k), y(k)) * [f1(x(k), y(k)); f2(x(k), y(k))] 其中,J(x, y)是方程组在(x, y)处的雅可比矩阵。迭代进行直至满足一定的停止准则。 现在我们来使用Matlab实现牛顿迭代法求解二元线性方程组的代码: function [x, y] = NewtonMethod(f1, f2, J, x0, y0, maxIter, tol) for k = 1:maxIter F = [f1(x0, y0); f2(x0, y0)]; J_inv = inv(J(x0, y0)); delta = -J_inv * F; x = x0 + delta(1); y = y0 + delta(2); if norm([x - x0; y - y0]) < tol break; end x0 = x; y0 = y; end end 其中,f1和f2是方程组的函数手柄;J是雅可比矩阵的函数手柄;x0和y0是初始解;maxIter是最大迭代次数;tol是迭代停止准则。 通过调用上述函数,即可求解给定的二元线性方程组

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值