我正在编写一个程序,使用最速下降法计算非线性方程的根。我在寻找导数时也遇到了问题(我将附上屏幕截图以更清楚地说明我在说什么)。我想使用numpy和sumpy方法,但由于距离考试时间不多,所以我匆忙地写了代码。
第一种情况是 x1 = -0.9,x2 = 0.7(根应该精确到 10^-6:x1 = -0.947718 和 x2 = 0.713550,但是却找到了完全不同的根)。
第二种情况是x1 = -0.1,x2 = 2.2(根必须精确到10^-6:x1 = -0.110086和x2 = 2.222477,就像牛顿法中的情况一样)。
非线性方程组:
方程根的图形定位:
该理论可以在这里看到:
程序代码,起点(-0.9,0.7):
import math
# первый корень
x1k = -0.9
x2k = 0.7
# второй корень
##x1k = -0.1
##x2k = 2.2
alpha = 0.25
## fx1_x1k_x2k = round(2 * (math.cos(x1k + 1.5) * (math.sin(x1k + 1.5) + 2.9 - x2k) + x1k + math.cos(x2k - 2)), 6)
## fx2_x1k_x2k = round(-2 * ((math.cos(x2k - 2) * math.sin(x2k - 2)) - x2k + math.sin(x1k + 1.5) + 2.9 + (x1k * math.sin(x1k + 1.5))), 6)
for k in range(1, 39):
fx1_x1k_x2k = round((2 * math.sin(x1k + x2k) * math.cos(x1k + x2k)) + (3.38 * x1k) - (2.6 * math.sin(x1k + x2k)) - (2.6 * x1k * math.cos(x1k + x2k)) - (2 * math.cos(x1k + x2k)) + 2.6, 6)
fx2_x1k_x2k = round(4 * x1k**3 + 0.16 * x2k**3 + (0.8 * x2k * x1k**2) + (0.4 * x2k**2 * 2 * x1k) - 4 * x1k - 0.8 * x2k, 6)
x1_current = round(x1k - alpha * fx1_x1k_x2k, 6)
x2_current = round(x2k - alpha * fx2_x1k_x2k, 6)
print(f'------------------------------------ k = {k} ------------------------------------')
print(f'x1_current = {x1_current}')
print(f'x2_current = {x2_current}')
print(f'|x1 - x1_current| = {round(abs(x1k - x1_current), 6)}')
x1k = x1_current
x2k = x2_current
找到第一个根的结果,我们得到 (-0.110084, 2.222471),而不是 (-0.947718, 0.713550),其中 k = 38:
------------------------------------ k = 1 ------------------------------------
x1_current = -0.904586
x2_current = 0.63008
|x1 - x1_current| = 0.004586
------------------------------------ k = 2 ------------------------------------
x1_current = -0.920633
x2_current = 0.550413
|x1 - x1_current| = 0.016047
------------------------------------ k = 3 ------------------------------------
x1_current = -0.950972
x2_current = 0.475969
|x1 - x1_current| = 0.030339
------------------------------------ k = 4 ------------------------------------
x1_current = -0.996371
x2_current = 0.432886
|x1 - x1_current| = 0.045399
...
------------------------------------ k = 38 ------------------------------------
x1_current = -0.110084
x2_current = 2.222471
|x1 - x1_current| = 1e-06
程序代码,起点(-0.1,2.2):
import math
# первый корень
##x1k = -0.9
##x2k = 0.7
# второй корень
x1k = -0.1
x2k = 2.2
alpha = 0.25
## fx1_x1k_x2k = round(2 * (math.cos(x1k + 1.5) * (math.sin(x1k + 1.5) + 2.9 - x2k) + x1k + math.cos(x2k - 2)), 6)
## fx2_x1k_x2k = round(-2 * ((math.cos(x2k - 2) * math.sin(x2k - 2)) - x2k + math.sin(x1k + 1.5) + 2.9 + (x1k * math.sin(x1k + 1.5))), 6)
for k in range(1, 39):
fx1_x1k_x2k = round((2 * math.sin(x1k + x2k) * math.cos(x1k + x2k)) + (3.38 * x1k) - (2.6 * math.sin(x1k + x2k)) - (2.6 * x1k * math.cos(x1k + x2k)) - (2 * math.cos(x1k + x2k)) + 2.6, 6)
fx2_x1k_x2k = round(4 * x1k**3 + 0.16 * x2k**3 + (0.8 * x2k * x1k**2) + (0.4 * x2k**2 * 2 * x1k) - 4 * x1k - 0.8 * x2k, 6)
x1_current = round(x1k - alpha * fx1_x1k_x2k, 6)
x2_current = round(x2k - alpha * fx2_x1k_x2k, 6)
print(f'------------------------------------ k = {k} ------------------------------------')
print(f'x1_current = {x1_current}')
print(f'x2_current = {x2_current}')
print(f'|x1 - x1_current| = {round(abs(x1k - x1_current), 6)}')
x1k = x1_current
x2k = x2_current
当 k = 21 时,求二阶根的结果是 (-0.110084, 2.222471):
------------------------------------ k = 1 ------------------------------------
x1_current = -0.106128
x2_current = 2.20748
|x1 - x1_current| = 0.006128
------------------------------------ k = 2 ------------------------------------
x1_current = -0.105683
x2_current = 2.212223
|x1 - x1_current| = 0.000445
------------------------------------ k = 3 ------------------------------------
x1_current = -0.108148
x2_current = 2.215606
|x1 - x1_current| = 0.002465
------------------------------------ k = 4 ------------------------------------
x1_current = -0.108136
x2_current = 2.217791
|x1 - x1_current| = 1.2e-05
...
------------------------------------ k = 21 ------------------------------------
x1_current = -0.110084
x2_current = 2.222471
|x1 - x1_current| = 1e-06




