關于m代碼轉py代碼的總結:
一、將全部m代碼轉py后,輸出曲線結果不對
原因分析:1、函數(shù)寫錯;2、兩種語言求解精度不一樣,產(chǎn)生的誤差累積;
解決方法:
1、最開始的笨方法:逐行代碼檢查;——太浪費時間
確實發(fā)現(xiàn)一些語法的問題:主要有:
? ? ? ?1.1 np.dot(a,b,c)=np.dot(a,b):矩陣連乘用@,兩個矩陣相乘用@或np.dot;
? ? ? ?1.2 在py中a=b表示a就是b,b就是a,a變化b也變化,應改為a=b.copy()
2、采樣py調用m代碼的方式:將部分函數(shù)寫成py,部分函數(shù)仍然是m;通過調用可以檢查部分py文件是否寫錯;(結果子函數(shù)沒寫錯,最終結果就是不對)
此處采用py調用octave的形式,實現(xiàn)py調用m代碼,主要在py里安裝oct2py模塊,該模塊具體使用請參考官方文檔:打開下面連接即可;
GitHub - blink1073/oct2py: Run MFiles from Python - GNU Octave to Python bridge
注意:此種調用方式需要安裝octave軟件(開源);
綜上:是不是可以斷定結果的差異是由兩種語言之間求解精度不一樣導致的呢?
笨人確實開始這么以為的,并且逐行調試py代碼以及matlab代碼并對比,發(fā)現(xiàn)兩者之間確實存在求解精度的問題。。。。。。。
后來,細想,上面對比對象錯了呀,應該對比的是py調octave的結果 和 octave本身的求解結果,通過對比發(fā)現(xiàn),該兩者精度一致,并不存在求解精度的問題;因此,還是本身程序寫的不對;
最后,將正確的m代碼,在octave下跑,octave和matlab求解結果一致(注意:存在精度差異,但不足以影響控制效果,可忽略);在正確代碼基礎上,逐行驗證錯誤的py代碼,一個循環(huán)不行就兩個循環(huán),終于發(fā)現(xiàn)錯誤了。。。。。是個小細節(jié)的問題。