使用MATLAB和Python迭代求解黃金分割

2021-07-25 18:33:21 字數 2743 閱讀 4356

雖說可能使用python寫幾段小**測試一下演算法,但是我現在學習的確實是matlab的教程。是mooler老爺子的書籍,matlab程式設計體驗。

第乙個話題是迭代,這在學習python的時候也是乙個比較重要的話題。書中的例子是用matlab來實現**分割的求解。用python實現了一下如下(看一下,稍後附加matlab程式): 1

#!/usr/bin/python 2 

3 from

math

import*

4  5 x =

3.0

6 num = 0

7 while

x != sqrt(

1+ x): 8

num += 1

9 x = sqrt(

1+ x)

10 print

("%d times,x = %f"

%(num,x))

11 print

("value of x is:%f"

% x)

12 部分輸出結果如下:

27 times,x = 1.618034

28 times,x = 1.618034

29 times,x = 1.618034

30 times,x = 1.618034

31 times,x = 1.618034

value of x is:1.618034

老爺子在書裡提到了,其實類似上面這個程式在描述上是有問題的。因為,理論計算上,第7行中的判斷條件是永遠也不會為true的。之所以能夠經過30幾步迭代後達到了乙個穩定值,是因為matlab採用了近似求解的方法。看起來,python也是採用了類似的求解方法。比較合理的演算法,在此處的判斷應該修改為x與期望值的偏差在浮點數在相應數值附近是否在最小表示偏差範圍內。查了一下,在pytho的math模組庫中並沒有提供類似的功能,網路查詢倒是發現numpy可以提供相似的功能。

借用numpy的功能,修改**如下: 1

#!/usr/bin/python 2 

3 from

math

import*

4 import

numpy 5 

6 x =

3.0

7 num = 0

8 while

abs(x - sqrt(

1+ x)) > numpy.spacing(x - sqrt(

1+ x)): 9

num += 1

10 x = sqrt(

1+ x)

11 print

("%d times,x = %f"

%(num,x))

12 print

("value of x is:%f"

% x)

13 再次執行程式,部分結果顯示如下:

27 times,x = 1.618034

28 times,x = 1.618034

29 times,x = 1.618034

30 times,x = 1.618034

31 times,x = 1.618034

value of x is:1.618034

現在的程式計算結果問題已經不大了,但是還是有值得優化的地方,那就是程式的while迴圈中存在兩次相同的平方根運算,這樣的效率相對會低一些。進一步優化程式如下: 1

#!/usr/bin/python 2 

3 from

math

import*

4 import

numpy 5 

6 x =

3.0

7 y =

0.0

8 num = 0

9  10 while

abs(x - y)> numpy.spacing(x):

11 num += 1

12 y = x

13 x = sqrt(

1+ x)

14 print

("%d times,x = %f"

%(num,x))

15 print

("value of x is:%f"

% x)

16 再次執行程式,部分縣市結果如下:

27 times,x = 1.618034

28 times,x = 1.618034

29 times,x = 1.618034

30 times,x = 1.618034

31 times,x = 1.618034

32 times,x = 1.618034

value of x is:1.618034

附加matlab的程式以及部分運算結果如下: 1

x =

3,y =0;

2 while

abs(x

-y)

>

eps(x) 3

y = x

;x = 

sqrt(1

+x)4 end 5 

結果: 8 

1.618033988749897 9 

10 11

x =

12 

13 1.618033988749895

14 15 

16 x =

17 

18 1.618033988749895

19 20 

21 x =

22 

23 1.618033988749895

matlab 資料和函式使用

1 整型 無符號整型8位整數資料範圍 000000000 111111111 有符號整型8位整數資料範圍 100000000 01111111 強制型別轉換 x int8 129 因為有符號整型最大值為127,所以129強制轉換後為127 x x int8 127 y uint8 129 因為無符號...

Python使用Matlab命令過程解析

為了在python中使用matlab命令,也就是import numpy as np 和 import matplotlib.pyplot as plt這兩個命令能執行,需要在cmd命令視窗輸入 pip install matplotlib,要不然出現 iwww.cppcns.commport nu...

Matlab和Python實現張量分解

1.python安裝教程 2.matlab 安裝和張量分解的匯入和使用 matlab的安裝方法 matlab tensor toolbox 實現hosvd 3.張量分解的介紹 cp分解和hosvd分解 張量分解 4.python張量分解 使用python tensorly 實現張量cp分解 使用py...