牛頓法 三維 Python實現

2021-10-11 21:09:33 字數 4394 閱讀 5330

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...