from mpl_toolkits.mplot3d import axes3d
from matplotlib import pyplot as plt
import matplotlib as mpl
from numpy import
*from sympy import symbols, diff
import numpy as np
'''牛頓法
'''x_1 =[0
,0]x_0 =
[x_1[0]
, x_1[1]
]x1, x2 = symbols(
'x1, x2'
)# 函式
f =100
*(x2-x1**2)
**2+(
1-x1)**2
print
("第0次迭代結果為\nf={}\n"
.format
(f.subs())
)df =
k1 =
k2 =
k3 =
k4 =
f =[
]f_x0 =
# 將偏導放入矩陣中
df =
[diff(f, x1)
, diff(f, x2)
]print
(df)
# print('\n')
for i in
range(0
,2):
, x1)
), x2)
)def
func
(a1, a2)
:# g
g_0 =
for i in
range(0
,2):
a = df[i]
print
('a='
, a)))
print
('g='
, g_0)
# f f_x0 =
for i in
range(0
,2):
for j in
range(0
,2):
a = f[i]
[j])
)# 求偏導之後,帶入數值
# print(a)
print
('f='
, f_x0)
# 一維陣列變二維
zj =
for i in
range(0
,2):
for j in
range(0
,2):
if j ==0:
) zj[i]2]
)# print(zj)
# 對f求逆
zj = np.array(zj, dtype=
'float'
)# 這時需要將資料格式進行更改將object改為float
fn = mat(zj)
.i # 求f的逆
# for i in range(0, 4):
# for j in range(0, 4):
# print(fn[i][j])
x_3 =
# print('fn*mat(g_0).t=', fn*mat(g_0).t)
x_2 =
(mat(x_1)
.t - fn*mat(g_0)
.t)# 求函式值
# print('x_2=', x_2)
# print(type(x_2))
x_2 = np.array(x_2, dtype=
'float'
)# 這時需要將資料格式進行更改將object改為float
# print('x_2=', x_2)
# print(type(x_2))
for i in
range(0
,2):
# 改變函式值的格式便於迴圈使用[0
])print
('函式值='
, x_3)
# print(type(x_3))
return x_3 # 返回函式值
# 最開始的函式值
n =0
# 存放迭代點
x_2 =
# 存放函式值
fx =
while n <2:
# print(func(x_1[0], x_1[1], x_1[2], x_1[3]))
n +=
1 x_1 = func(x_1[0]
, x_1[1]
)print
("第{}次迭代結果為\nf={}\n"
.format
(n, f.subs())
)))# 畫圖
x_2 = np.array(x_2)
print
('x_2='
, x_2)
x_3 =
[x_0[0]
]x_4 =
[x_0[1]
]print
('x_3='
, x_3)
print
('x_4='
, x_4)
mpl.rcparams[
'font.sans-serif']=
[u'simhei'
]# 解決標題中文無法顯示問題
mpl.rcparams[
'axes.unicode_minus']=
false
fx = np.array(fx)
for i in
range(0
,len
(x_2)):
[0])
[1])
deffunction
(x3, x4)
:return
100*
(x4-x3**2)
**2+(
1-x3)**2
fig = plt.figure(
)ax = axes3d(fig)
x1 = np.arange(
-0.5
,1.5
,0.05
)x2 = np.arange(
-0.5
,1.5
,0.05
)# print('x2=', x2)
# print(type(x2))
x, y = np.meshgrid(x1, x2)
# 網格的建立,這個是關鍵
z =100
*(y-x**2)
**2+(
1-x)**2
# x_3.pop(0)
print
('x_3='
, x_3)
# x_4.pop(-1)
print
('x_4='
, x_4)
x3 = np.array(x_3)
x4 = np.array(x_4)
# print('x4=', x4)
# print(type(x4))
x1_list =
x2_list =
y_list =
for i in
range(0
,len
(x_3)):
# 將梯度所用的點收集用於畫圖))
, x_4[i]))
print
('f='
, y_list)
ax.contour(x, y, z,
100)
# 畫出函式上的線
# ax.contour(x, y, z, zdir='z', offset=-3, cmap="rainbow") # 生成z方向投影,投到x-y平面
# x1, y1 = np.meshgrid(x1_list, x2_list) # 網格的建立,這個是關鍵
# z1 = 100*(y1-x1**2)**2 + (1-x1)**2
plt.xlabel(
'x1'
)plt.ylabel(
'x2'
)# ax.plot_su***ce(x1, y1, z1, rstride=5, cstride=5, cmap='rainbow')
ax.plot(x1_list, x2_list, y_list,
'r*--'
)# 畫出梯度線
ax.set_title(
'起點(0,0)經2次迭代截止點為(1,1) f(x*)=0'
對比梯度法有乙個很大進步
python三維座標 python中三維輪廓的座標
感謝在這個 上獲得的知識。我能寫乙個簡單的指令碼,列印出等高線圖的座標 x和y 在 下面是乙個例子 from numpy import from pylab import generate a set of random points npts 500 phi random npts 2 pi th...
python實現牛頓法 牛頓迭代法Python實現
例1 給定方程 f x x 2 sin x 1 0 判別該方程有幾個實根,並用牛頓法求出方程所有實根,精確到 10 解 利用畫圖法觀察根的所在區間為 2,1 和 0,1 其中藍色為 y f x 的曲線,橘黃色的直線是 y 0 畫圖 import numpy as np import matplotl...
一維牛頓法與多維牛頓法
julia中文文件 鼎鼎有名的泰勒展開式 收斂速度快 增加了乙個步長,步長用劃界法或其他方法來確定,保證每步都下降 修正目的 為非線性回歸的目標函式是使殘差最小,本質上還是乙個求最小值的問題 o矩陣的元素一般為0,可以省略 可見高斯牛頓法只需要用到一階偏導即可 using linearalgebra...