python解線性方程組
㈠ python解決jacob迭代法求解線性方程組
題主好. 經典的 Jacobi 迭代演算法如下:
設 A = D - E, 則 x = D^{-1}*b + D^{-1}*E*x = C + T*x
可以參考如下代碼(復制代碼後請注意縮進):
import numpy as np
def linalg_solve_jacobi(A, b, x0, max_it, tol=1.0e-7):
# 判斷 A, b 的維數是否正確
if A.shape[0]!=A.shape[1] or A.shape[0]!= b.shape[0]:
raise Exception('A must be square or A and b must be compatible!')
D = np.diag(A)
# 判斷對角元素是否含零
if np.amin(np.absolute(D)) < 1e-14:
raise Exception('Diagonal elements of A must not be zeros!')
# 設置初始迭代步數為0
n = 0
#
# Jacobi 演算法:
# 設 A = D - E, 則 x = D^{-1}*b + D^{-1}*E*x = C + T*x
#
invD = np.diag(1.0/D) # invD is inv(D)
C = np.dot(invD,b) # C is inv(D)*b
T = np.dot(invD, np.diag(D)-A) # T is inv(D)*E
while n < max_it:
x = C + np.dot(T, x0)
if np.linalg.norm(x-x0)<tol:
break
x0[:] = x
n+=1
# 如果超過最大迭代步數, 迭代失敗
if n>max_it:
raise Exception('Failed to converge within {} steps!'.format(max_it))
# 成功, 返回
return x, n
if __name__ == "__main__":
A = np.array([[10, -1, 2, 0],[-1, 11, -1, 3],
[2, -1, 10, -1], [0, 3, -1, 8]], dtype=np.float64)
b = np.array([6, 25, -11, 15], dtype=np.float64)
x0 = np.array([0,0,0,0], dtype=np.float64)
max_it = 100
tol = 1.0e-7
x,n=linalg_solve_jacobi(A, b, x0, max_it, tol)
print(x,n)
㈡ App Store上有哪些冷門但逆天的 App
App Store 應用商店中有不少的應用APP,很多其實比我們常用的一些軟體還好用,只是因為某些原因導致名氣不大,不被大家熟知而已。而且一些都是一些素人開發者開發出來的,所以說在功能方面更加的貼合我們的生活,那麼有哪些在在蘋果APP Store上冷門卻逆天的應用呢?
1、MathStudio(強大無敵)
這是一個致力於數學計算的工具,冷門至極畢竟沒有那麼多的學霸會喜歡用來搞什麼數學計算研究一類的,而使用的基本上都是真正的內行人。所以自然冷門十足,但是卻不可小看它,這個APP實力可謂是強大無比,對於簡單的四則運算和什麼函數、指數、對數、開方等運算都可以計算,更厲害的是有很多的高級的運算。
像高數中求極限、導數、多元函數的偏導數、算不定積分、畫函數圖像、方程圖像更是小意思了。反正你高數上能用到的圖像、公式基本上都能用它搞出來,最恐怖的是竟然自帶一個編程環境,讓人不得不懷疑這是哪個學霸研發出來的。
而且別看這么逆天的功能存在,它的內存超乎你想像,不要998隻要區區4M左右就完成了,當然,這個 App 肯定有缺點就是價格有點貴好像兩百多還是多少,不過絕對的物超所值!
2、Stellarium(虛擬天文館)
這款軟體適合那些對天文學抱有很大興趣的朋友,當然你要是為了裝裝高內涵也可以。因為你有理他可以看你想看到的星星,還能知道是什麼 星座 的星星, 對著天空,你往哪裡擺,app上的星象圖也會跟著動。這是一款十足的觀星神器,只是用的人少打分更少。
3、 開眼
平時你看的很多短視頻都是很庸俗們什麼營養的,但是只要你下載了這款軟體就可以避免再刷到那麼多的奇葩。你只要用了這款軟體絕對能學到 不少干貨,而且這里 絕對沒有很多無聊的東西,有的都是一些十分有用的東西,真正的讓你做到開眼看世界。因為沒有什麼亂七糟八的東西,自然省卻了我們不少的時間,對於想要學的人來說這是絕對純凈的軟體。
4. 國家地理
對於那些想要 探索 其他國家神秘美景事件的人來說這是一個不容錯過的軟體,它的名字可能你曾經聽說過。沒錯就是那個國家地理雜志,人家可是出了這款APP的,裡面都是各地高清的圖集、圖片,讓你一覽各地的名勝古跡,雲 旅遊 絕對爽!
5、Pythonista
這是一個強大的Python編輯器,不過想要完全的掌握好它就需要懂得一定的Python運作。若只從編輯器的角度來看,它無疑很優秀。支持多種顏色主題,強大的小鍵盤,輸入聯想,還內置了無數強悍的Python模塊。而且他的厲害之處在於在懂的人手裡直接變成一款神器,可以用來處理執行各種的腳本數據還可以建模、建動畫、做個時鍾等等,還可以做小 游戲 來玩,堪稱強大。
6、好奇心日報
它絕對是新聞閱讀類APP中的一股清流,沒有博眼球的震驚派標題黨,也沒有密密麻麻的小廣告,界面乾乾凈凈,看起來十分的舒服。除了簡潔到性冷淡的界面,最吸引人的是它優質的內容,涉及到商業、 娛樂 、藝術、 科技 、 時尚 等各個方面,有新鮮獨特的資訊,也有深刻的分析報道。
另外它還有特別有意思的欄目,比如:浮華日報、這世界、為什麼讀書等等,總之它的內容可以用高逼格、有深度、漲姿勢來形容,早上起來上去刷一刷已經成了我的習慣了。
7、幕布
這是一個幫助你整理思路的一個想法工具,對於你做計劃還是什麼寫文章、記錄想法等都可以使用,它能將你的想法以結構框架的形式來展示出來,像思維導圖一樣,將重點整理清楚、條理疏理完善,對於你理清邏輯,整理思路,都有很大的幫助。更加厲害的是這款軟體還能夠支持PC端和手機端的同步,既可以在手機上編輯,又可以在電腦上碼字,非常便利。
8、潮汐
很靈性的一款軟體的軟體,當你想要做事情想輕松愉快的進行卻又不想聽歌的時候,就可以選擇他來陪伴你。它的內置功能就是通過那些自然界清脆、輕盈的聲音像:白噪音、海浪、鳥叫、下雨聲等既不讓你感覺冷清,又能讓你集中精神。另外還可以幫助我們進入睡眠,夜晚睡覺的時候藉助那些自然界輕緩的聲音幫助你快速入睡,第二天也可以將你輕柔的喚醒。另外,App會每天自動生成一張高清壁紙和一句名言,每當打開App看到這些句子和壁紙,都很驚喜。希望新的一年,它也能幫助你更專注地工作。
9、蝸牛睡眠
一些人總是因為各種各樣的原因導致熬夜晚睡,時間一長就導致了睡眠質量大跌,而這個軟體就是一個很不錯的幫助我們睡眠的APP。他的厲害之處就在於記錄你的深睡時間、淺睡時間、做夢時間、環境噪音,進而給出睡眠質量打分,讓你可以依據這些數據,改善你的睡眠狀況。
還有神奇的功能就是能夠記錄夜晚睡覺的鼾聲和夢話,這樣你的朋友在打鼾、說夢話的時候你就有證據了,到時候給他聽聽那情景肯定很美妙。
10、千與千尋
名字就很特別相信很多人都知道。這也是一款神奇的軟體,因為這里可以看到別人的聊天記錄,這可是一個很有意思的操作,還能選擇不公開。這樣一來對於那些情商有待提高的朋友,可以借鑒聊騷達人的先進經驗,也可以看看感興趣的妹子,不用聊天就能迅速了解一個人這你還不可嗎?因為畢竟使用的人數少,不像國內的那些軟體那樣多,所以相對比較的冷門。即便啥也不幹,當個樹洞也不錯啊!
好了今天給大家分享的就是這幾類APP,覺得實用的話大家可以去試試哦!
無錫創元傳媒:四夕
這9款冷門但逆天的APP真的絕了!強烈安利!!
1、桌面時鍾(iOS/Android)一個主題非常豐富的手機桌面時鍾,功能極簡,打開就是一個時鍾,但是裡面的時鍾主題非常豐富,比如我最愛的生辰鍾、太空表盤時鍾、 科技 館十足的輝光管時鍾,用起來不僅顏值高而且提升專注力!
超級有靈氣的短句子APP,整體風格太簡約治癒了!裡面的句子不僅治癒心理的不開心也適合喜歡發朋友圈和早安晚安語錄的朋友,模板超級好看!
這是一款可以製作壁紙和桌面美化的萬能小組件APP,製作的壁紙簡直太贊了有個性了!桌面小組件我最喜歡太空人和每日提醒TODO-list,放桌面真的超方便。
記錄每日心情,這款微手帳APP是讓我愛上電子手帳的原因,簡直是太方便了!裡面不僅有各式各樣的免費素材貼紙,還有很多信紙、背景圖,還可以插入照片,更好地記錄生活。
對於看完電影習慣寫一些影評發個朋友圈,但又不想拍電影票,想高逼格點。這款App,可以說是便利直通車。 App里不僅能找到很多精美的海報,還能直接看到豆瓣影評。 現在我想看電影都是直接在這上面搜索,看完電影的介紹點評再決定是否要去看這部電影。
這個APP集合了 免費、書多、讀書體驗好 這三個,每天會有一個小時的免費閱讀時間,超過了才要收費,一小時的讀書時間對我來說是完全夠的,久而久之我也養成了每天讀一小時書的習慣。而且裡面的書非常多,想看的基本都能找得到,官方還會根據閱讀習慣推薦用戶一些優質的書單。
一個完全免費的日語五十音學習軟體,它支持多種學習模式,平假名轉換成片假名、片假名轉換成平假名、聽寫模式、復習模式、測試模式、拗音查閱。
Mars圍繞城市中的商圈,推薦那些非常值得去的餐廳、酒店、酒吧、家居店鋪、書店、藝術展覽,總之是當地人經常消遣時光的好地方。而且這些地方都是當地的編輯們親自考察的,每一個都值得去。
我來說一說我的手機里有些什麼特別厲害的軟體。
1,捷徑,如果說iOS 12有什麼特別厲害的軟體那麼捷徑絕對是其中最厲害的一個。捷徑就像是最早的按鍵精靈一樣,然後由於開放了軟體的API介面,所以捷徑的功能及其強大。你可以輕易的實現一些特別的功能,比如網盤萬能鑰匙,一鍵下載YouTube視頻,無損音樂下載。而且你可以輕易的,或許別人製作的規則。無限擴展捷徑的功能。
2,Gpsfake,這是一個可以修改你定位的工具。如果你受夠了釘釘打卡的折磨,這個工具可以幫助你。
3,Procam6,這是一個非常專業的相機軟體。讓你的iOS設備跟單反一樣可以調節iSO,快門,白平衡等設置,甚至他還可以超頻你的攝像頭。讓你的視頻解析度遠超過官方的解析度。
4,谷歌地球,這是一個讓你不出家門,就能夠游覽全世界的工具。
5,奧維互動地圖。這是一個能夠精確讀取那個經緯度的地圖,我一般在找無人機的時候就會利用到他。
6,Videoleap,這可能是IOS 上最好用的編輯軟體了。
7,nPlayer ,這可能是iOS上格式支持最多的視頻播放軟體,而且支持區域網播放。
iSoul
iSoul 是一個iPhone 防盜助手App。
使用它可以防止你的iPhone 手機丟失,防盜。
它有很多模式,你可以隨時設置。比如桌面模式,離開桌面就會發出警報。
還有飛行模式(飛行模式模式開啟),口袋模式(拿出口袋),距離模式(超出距離)等等。
這些常用的模式,一旦觸發,就會發出警報,不管是在做地鐵公交,或者是公共場合,手機永遠不會丟。
Workflow
用iPhone 的人,手機一個有一個App,那就是Workflow,如果沒有,你的手機就白買了。
它和上面接收的IFTTT 類似,但是更接地氣,更加使用與iOS 系統,比如你發送一個東西,從一個App 發送一個東西,扔給Workflow 就行了。想要將網頁保存為圖片或者PDF,它也能做。每天給你發送精美圖片,幫你查天氣預報天氣,自己做一個翻譯工具等等太多了。對它都可以的,更多大家可以去搜索,只要你腦洞足夠大,Workflow 讓你玩出很多花樣。
而且最近它被蘋果爸爸收購了,也看出它的優秀,以後再系統中集成,那功能就更強大了。我們拭目以待。
JSBox
JSBox 是一個具有JS 編程環境的iOS App。
使用它你可以隨意編寫自己的工具,只要你稍微懂點編程,JS 你就可以使用。
使用它可以查詢天氣,新拍的照片自動上傳伺服器等等,只要你腦洞夠大,能寫出更多不一樣的東西。
而且它還有漂亮的編輯器,支持自動補全,主題切換,快速輸入等功能。
同時還有iOS 原生介面供你使用。
搜狗聽寫
搜狗聽寫是一款實時語音轉文字的App。
可以把它當做你的錄音筆,使用它可以輕松寫文章,筆記整理,采訪錄音等等。
而且它還能同時保留語音和文字,並且不限時長,錄音的時候還可以添加重點標記。
同時它還多端同步,而且還可以在電腦瀏覽器中訪問編輯。
還可以一鍵將內容分享給第三方平台。
悟空遙控器
悟空遙控器是一個智能電視 / 智能盒子 遙控器App。
只需要手機端和電視端安裝之後,就可以使用手機遙控電視了,同時支持手勢,方向鍵,滑鼠,數字鍵,讓你隨心操作。
同時支持各大電視和盒子,全網電視隨時播放,而且還可以投放網路雲的資源哦,這個感覺很棒啊,私藏在網路雲的小電影也可以一鍵播放。
同時內置高清直播,綜藝,熱門電視劇也不錯過。
那今天就來做個iOS專場,專門來說說App Store上那些好用卻不一定被大眾熟知的小眾APP。應用類型廣泛、功能強大,建議先收藏~
一款設計簡單、主打可愛風格的心情日記。可以用文字表情標記心情,也可以動手繪制屬於自己的可愛微表情。支持圖片上傳,超多可愛的貼紙素材,讓記錄手帳成為更有趣又治癒的事。
一款由 Google 開發的照片編輯工具,提供29種工具和濾鏡,可以局部修圖,一件解決局部問題,也可以直接套用自帶樣式,濾鏡非常多。總之,質感修圖,用它!
一款集合了小組件、主題、壁紙的桌面美化工具,可製作抽屜式等個性化壁紙。小組件的主題也很豐富,有時鍾、之前很火的太空表盤、倒計時、日歷、to do list待辦事項、語錄、便簽等等,小組件支持全透明效果。
一個功能非常強大的數學/高數學習軟體,支持解決8類數學問題,100多個數學計算器,可以輔助解決大部分數學問題,提供詳細的解題步驟,讓數學學習從此無憂。
讓手機充電擁有黑 科技 效果的蘋果充電動畫app,提供時下最熱門酷炫的主題充電動畫和提示音,讓個性充電動畫不再只是安卓的專利。玩機愛好者必備~
一款純粹的網頁瀏覽器,沒有廣告,沒有推薦,界面十分簡潔。內置AI引擎、網路、搜狗、谷歌搜索,包含作業學習、實習工作、翻譯查詢、高考查詢、生活查詢及各種AI黑 科技 ,功能相當強大。
清單式的筆記工具,無論是日常寫作列提綱,還是整理學習工作筆記,用了它,邏輯條理、框架結構都不成問題。還可將文字內容提煉出核心觀點,一鍵生成思維導圖,懶癌患者必備!
一個分享打動人心事物的 App,每天都會推薦一首歌、一則語錄、一篇文章,每天用十幾分鍾的細碎時光,點燃內心的光明。
以上就是推薦的全部內容,有需要的話可以安裝體驗一下~
想起自己用手機這么久,你說冷門比較逆天的APP或者說哪些腦洞極大的APP,還真是遇到過幾個,閑著無聊就先寫出來分享給各位好了:
1.B格滿滿的3D照片—Fyuse
Fyuse一直是在國外相對比較火的一款攝影軟體,主打3D照片,可以讓你用完全不同的角度去看你所拍的東西。別人只能展示簡單的一面,但是你可以展示照片的360度
而且Fyuse有他自己的社交功能,日常就可以看到大佬們拍攝的奇思妙想,當然不建議大半夜的瀏覽,因為置頂的 美食 欄非常的喪心病狂。
像最近就開始了各種萬聖節妝容什麼的,可以說是資本主義真會玩系列。
新奇好玩的各種拍攝角度,完全可以滿足360度想要呈現眼前場景的需求。
值得一提的是,這個APP拿來做一些產品展示的時候,可以展示到你想看到的每一個細節,之前做外貿行業的時候,給客戶看用這個APP展示出來的產品,B格簡直不要太高。
2.手殘版P圖軟體—Photo Lab
這個APP可以說是B格拯救神器,完全可以拯救不會拍照星人和不會P圖星人,一鍵Copy特效的功能簡直讓人感覺太他媽的逆天了
首頁直接推薦比較好看的照片濾鏡,然後會有原圖展示,你只要把自己相冊里和原圖風格差不多的照片選中,然後選擇使用這個風格。。
然後就自動幫你P成大片效果。你什麼都不用管。。。
是的,就是這么智能,就是這么簡單粗暴。。
3.強大的遠程桌面工具—向日葵遠程式控制制軟體,控制手機和電腦這款APP是一個做設計的基友安利的,他是在家時遠程修圖。我覺得比較吸引我去用的是,它能適配各種系統來控制手機和電腦,用來把妹、哄老闆、防小三那是扛扛的~
比如,學妹電腦有問題了,你一個手機過去就能遠程幫她修理,對方驚喜之餘就對你有好感了;隨時遠控公司的電腦,老大需要啥你都能立馬處理,給他一個時時刻刻我都在待命著工作的勤奮印象,即使你可能已經在酒吧嗨的忘了家在哪裡了;防小三,你懂的,直接控制他手機~呃~這種操作當我沒說啊,最好的當然是用來控制父母手機,你遠在外地工作也能遠程教他們用智能手機。
桌面控制就是控制電腦或手機的桌面
攝像頭,直接就是調用攝像頭,可以當監控用。。。當你給小姐姐修電腦時,這個操作要小心。。。
遠程文件,直接是手機與電腦之間上傳或下載文件,相當於雲盤了。
CMD,直接在上ping命令,運維工程師會用得到
同樣的這個也非常適合各種 游戲 掛機黨,擔心自己的自動掛機是不是停了呀,或者是文明建造進度現在如何呀,牧場的莊稼是不是可以收了呀。
4. 可能是最逆天的 游戲 應用—S.M.T.H,中文名送我上西天。這個不是IOS系統中的 游戲 的主要原因是為了用戶考慮。畢竟蘋果這么貴,還是會挺心疼的。。
因為作為一款手機 游戲 應用,他可能會是最令人感到心跳加速的 游戲 應用。
但是內容十分簡單,就是把手機扔上天
當然就會有朋友好奇的問,那要是沒接住怎麼辦呢?
呵呵,你說呢?
這款 游戲 應用十分適合朋友聚會的時候大家一起掏出來比一比,畢竟這款 游戲 不單單逆天,他可以說是真正的你咋不上天級別的 游戲 了。
要說冷門並且逆天的 App,有一個特別符合要求:MathStudio:
這個 App 足夠冷門:在 App Store 的中國區冷得都沒有評論與打分。不過肯定算得上是逆天,下面說一下這個 App 為什麼能稱得上是逆天。
作為一個數學計算工具,那類似普通的 1+1 什麼的四則運算表達式當然能做了,加減乘除、乘方、開方、指數、對數、(反)三角函數都可以計算:
當然,既然稱之為逆天,那絕對不止只能算一些這樣的表達式。還可以:
解方程:
求極限也是小意思了:
求導數,包括多元函數的偏導數:
除了能求導,還可以算不定積分與定積分:
畫函數圖像、方程圖像更是小意思了。MathStudio可以畫:
矩陣、行列式、線性方程組那些,比如計算矩陣的某個行列式、求逆矩陣、矩陣乘法、SVD 分解等等:
傅里葉展開:
概率論與數理統計那些,比如畫正態分布曲線、求二項分布的 PDF (概率密度函數)和 CDF (概率累積函數):
自然語言處理:
這個 App 居然還帶了一個編程環境:
解析 JSON:
元胞自動機:
要是有閑情逸致可以搞出個俄羅斯方塊或者貪吃蛇:
除此之外的功能還有不少,在這里肯定不能一一介紹,可以移步在 MathStudio 官網的在線界面里查看:MathStudio。到這里,相信看官會認同這對得起「逆天」的稱呼。這應該是 iOS 上最強大的數學工具了。
有人可能會想,這個和 WolframAlpha 相比怎麼樣?這個軟體相對於 WolframAlpha 有個決定性的優點:
不用聯網
嗯,不用像 WolframAlpha 那樣要先把計算需求發送到伺服器那邊,等伺服器算一陣子再拿到結果,而是輸入完需要計算的項目後點 Solve,Plot 等立刻能得到結果。當然,可以離線用。
然後,這個 App 居然還提供了 Apple Watch 支持:
最後,你會想,這么一個功能逆天的 App 下載下來豈不要佔一大塊兒存儲空間?要用一百多還是兩百多 MB?
答案是:不到 4 MB。這基本就是一個中型、大型 App 的零頭,甚至比某些 游戲 或 App 的單張貼圖、切圖還小。用 Wi-Fi 的話基本是秒下,就連用流量下載都不心疼。相比之下 WolframAlpha 要用二十多 MB。這樣哪怕你用的是 16GB 版的 iPhone 都不會在意佔用存儲空間。
這個 App 有點兒年頭了。至少我在 09、10 年上高中時,就在 iPod touch,iPhone OS 3.x 上用過了。那時還叫 SpaceTime,後來才改名為 MathStudio。在那時候功能就已經十分強大,和現在差不多了。
【刪除】當然,這個 App 肯定有缺點。就是:
貴啊,兩百多人民幣。這大概就是其冷門的原因吧……【刪除完】
-
好吧,我承認,高中用臭名昭著的 91 手機助手在 iPod touch 上裝的這個。現在用的是在去年限免的時候下載的。這下你們相信我沒在臭得瑟了吧……
確實價錢有些貴,不過如果有網路,可以用在線版的。
不多說,直接上APP!
Notability一款能實現無紙化筆記的APP,iPhone、iPad、macdo都能用。
可以導入課件/PPT,在上面做記錄,可以自動備份和 iCloud 同步。
使用各種筆記、日記和繪圖工具、例如墨水筆、熒光筆、文字和音頻。
小睡眠一款能監測睡眠的APP,臨睡前開啟睡眠記錄功能,會根據你晚上的睡眠情況,進行評估。
會給你提供睡眠改善建議,也能錄下你晚上說過的夢話,或者鼾聲。
可以設置第二天起床的鬧鈴,主打無痛喚醒,鬧鈴聲舒緩,使用感特別好。
Anki一款功能強大的卡組背誦APP,會根據你的復習效果生成圖表和統計數據。
界面簡單,使用方便,但價格是真的高。目前也有不少平替的APP。
夜之森一款治癒系的養成 游戲 ,而且免費。喜歡貓咪,喜歡治癒 游戲 的寶,一定別錯過!
游戲 里的貓咪會幫你尋找種子,貓咪每次外出都會給你帶回不同的種子或者動物,你可以選擇要培育的種子,還有培育植物的小動物,它們就會留下來啦~
MarginNote 3一款綜合性的閱讀筆記工具,集合了思維導圖、卡組背誦,筆記記錄等功能。
因為功能多,所以上手沒這么簡單,需要摸索。這款APP也是支持iPhone iPad Mac使用。
目前移動端和PC端的收費不統一,所以購買前需要了解清楚。
Hi,我是阿詹,這5款冷門實用的APP,後悔沒早點知道,且聽我慢慢道來!
一、掌閱精選
之前只知道掌閱,沒想到還有這個APP,它專注於為用戶提供精品書籍閱讀服務,擁有搜索找書和專業分類找書功能,用戶可以對感興趣的書放入書架或者直接購買,最令人意外的就是如果對購買的書籍不滿意,還可以在規定時間里進行退還,整體閱讀界面也很舒服,推薦一下!
二、數蟻
一款效率工具,用這個APP可以隨時隨地的查看、管理使用以及分享工作資料,還可以安全的進行備份,即使外出了,也能輕鬆通過手機來進行溝通處理,重要的是它為你提供了2T的存儲,以及15MB的高速訪問,最後它對個人資料以及知識庫都有水印保護,還是不錯的。
三、幕布
簡單的說,它是一款雲端筆記,支持win、mac、安卓、ios,能做到信息全平台同步,但令人最為誇贊的是它能將筆記一鍵轉換成思維導圖,這其實有助於人們的辦公和學習,同時APP遵循簡約的風格,讓人看起來很舒服!
四、echo回聲
這個APP,我第一次聽的時候就被震撼到了,原來音樂也可以有3D效果,那種帶上耳機出現的環繞效果,對於聽歌來說,體驗真的很奇妙,而且這裡面有很多的民間高手自己創作的音樂,很好聽,還有彈幕式的評論,總體來說它屬於一款小而精的APP。
五、樂網plus
這是一款廣告攔截APP,專門針對視頻廣告、彈窗廣告、惡意廣告等進行攔截,這樣就能舒服的看電視了,同時還能提升網頁載入速度,減少流量的流失,算一款比較實用的APP吧,需要的朋友可以下載。
真的逆天的app,也就不太會冷門了。
所以我們還是說一下,你可能沒見過的一些好的app,或者我們都覺得不錯的app吧…
snapseed,vsco,修圖必須
一言,文藝范十足
inside、rider、stack、dancing line,都是不錯的 游戲 。
小小航海士,是個很懷舊的不錯的單機大航海 游戲 。
籃球助手Pro,是我見過最好用的籃球計分系統,當然,如果有用著更好的介紹給我。
artomaton,一個將照片油畫化的日本軟體,效果很好,而且可以部分油畫化。
slowfast,視頻變快變慢
brushstorke 油畫化圖片,感覺上面的好些。
極簡匯率,我喜歡簡單專一的工具
變速map3,聽mp3外語很有用,可以中段重播的復讀機
onedrive,不說了吧,同步PC的網盤,我用了好多,金山之後,億方雲和網路感覺都太復雜了。
微車,我不能告訴你為啥微車好,我只能告訴你,如果你有一張電子拍照的扣分罰單,你用微車支付試試看,可能運氣會好些。
clear,火極一時的代辦任務。
錘子便簽,雖然也有一些一般的地方,但是成長圖效果還可以吧。
概念畫板和sketchbook,手繪板最好的。
以上都是我手機必裝的,太大眾的就不寫了,比如高德,你寫他幹嘛呢?
我真不知道app冷門後還能逆天,如果各位知道,告訴我。
我就是推薦下各位我覺得好用的app。
㈢ App Store 有哪些少有人知的逆天 app
MathStudio:
作為一個數學計算工具,那類似普通的 1 1 什麼的四則運算表達式當然能做了,加減乘除、乘方、開方、指數、對數、(反)三角函數都可以計算。當然,既然稱之為逆天,那絕對不止只能算一些這樣的表達式。還可以:解方程。求極限也是小意思了,求導數,包括多元函數的偏導數。除了能求導,還可以算不定積分與定積分,畫函數圖像、方程圖像更是小意思了。
MathStudio可以畫:
2D 與 3D 的函數、方程圖像
笛卡爾座標、極座標、柱座標
參數方程表述形式
隱函數曲線
矢量場
可以用滾動條來控制某個變數的大小
可以用時間來控制函數圖像(使用特殊的變數 T),例如畫 sin(x T) 的結果是一個不斷平移的正弦波動畫……
矩陣、行列式、線性方程組那些,比如計算矩陣的某個行列式、求逆矩陣、矩陣乘法、SVD 分解等等。傅里葉展開、概率論與數理統計那些,比如畫正態分布曲線、求二項分布的 PDF (概率密度函數)和 CDF (概率累積函數)。
這個 App 居然還帶了一個編程環境:
解析 JSON、元胞自動機,要是有閑情逸致可以搞出個俄羅斯方塊或者貪吃蛇。
有人可能會想,這個和 WolframAlpha 相比怎麼樣?這個軟體相對於 WolframAlpha 有個決定性的優點:不用聯網。嗯,不用像 WolframAlpha 那樣要先把計算需求發送到伺服器那邊,等伺服器算一陣子再拿到結果,而是輸入完需要計算的項目後點 Solve,Plot 等立刻能得到結果。當然,可以離線用。
然後,這個 App 居然還提供了 Apple Watch 支持:
最後,這么一個 App 下載下來占存儲空間不到 4 MB。這基本就是一個中型、大型 App 的零頭,甚至比某些游戲或 App 的單張貼圖、切圖還小。用 Wi-Fi 的話基本是秒下,就連用流量下載都不心疼。相比之下 WolframAlpha 要用二十多 MB。這樣哪怕你用的是 16GB 版的 iPhone 都不會在意佔用存儲空間。
㈣ 用python如何求解非齊次線性方程組的一組正值特解,
其實更簡單的「取值」方法是 令 x3 = x4 = 0,得特解 (1, 1, 0, 0)^T.
4 個未知數,2 個方程,任意給出 2 個未知數的值,
算出另 2 個未知數,都可以得到 1 組特解,
只不過形式越簡單越好,例如取 特解 (1, 1, 0, 0)^T。
㈤ 萬字教你如何用 Python 實現線性規劃
想像一下,您有一個線性方程組和不等式系統。這樣的系統通常有許多可能的解決方案。線性規劃是一組數學和計算工具,可讓您找到該系統的特定解,該解對應於某些其他線性函數的最大值或最小值。
混合整數線性規劃是 線性規劃 的擴展。它處理至少一個變數採用離散整數而不是連續值的問題。盡管乍一看混合整數問題與連續變數問題相似,但它們在靈活性和精度方面具有顯著優勢。
整數變數對於正確表示自然用整數表示的數量很重要,例如生產的飛機數量或服務的客戶數量。
一種特別重要的整數變數是 二進制變數 。它只能取 零 或 一 的值,在做出是或否的決定時很有用,例如是否應該建造工廠或者是否應該打開或關閉機器。您還可以使用它們來模擬邏輯約束。
線性規劃是一種基本的優化技術,已在科學和數學密集型領域使用了數十年。它精確、相對快速,適用於一系列實際應用。
混合整數線性規劃允許您克服線性規劃的許多限制。您可以使用分段線性函數近似非線性函數、使用半連續變數、模型邏輯約束等。它是一種計算密集型工具,但計算機硬體和軟體的進步使其每天都更加適用。
通常,當人們試圖制定和解決優化問題時,第一個問題是他們是否可以應用線性規劃或混合整數線性規劃。
以下文章說明了線性規劃和混合整數線性規劃的一些用例:
隨著計算機能力的增強、演算法的改進以及更多用戶友好的軟體解決方案的出現,線性規劃,尤其是混合整數線性規劃的重要性隨著時間的推移而增加。
解決線性規劃問題的基本方法稱為,它有多種變體。另一種流行的方法是。
混合整數線性規劃問題可以通過更復雜且計算量更大的方法來解決,例如,它在幕後使用線性規劃。這種方法的一些變體是,它涉及使用 切割平面 ,以及。
有幾種適用於線性規劃和混合整數線性規劃的合適且眾所周知的 Python 工具。其中一些是開源的,而另一些是專有的。您是否需要免費或付費工具取決於問題的規模和復雜性,以及對速度和靈活性的需求。
值得一提的是,幾乎所有廣泛使用的線性規劃和混合整數線性規劃庫都是以 Fortran 或 C 或 C++ 原生和編寫的。這是因為線性規劃需要對(通常很大)矩陣進行計算密集型工作。此類庫稱為求解器。Python 工具只是求解器的包裝器。
Python 適合圍繞本機庫構建包裝器,因為它可以很好地與 C/C++ 配合使用。對於本教程,您不需要任何 C/C++(或 Fortran),但如果您想了解有關此酷功能的更多信息,請查看以下資源:
基本上,當您定義和求解模型時,您使用 Python 函數或方法調用低級庫,該庫執行實際優化工作並將解決方案返回給您的 Python 對象。
幾個免費的 Python 庫專門用於與線性或混合整數線性規劃求解器交互:
在本教程中,您將使用SciPy和PuLP來定義和解決線性規劃問題。
在本節中,您將看到線性規劃問題的兩個示例:
您將在下一節中使用 Python 來解決這兩個問題。
考慮以下線性規劃問題:
你需要找到X和Ÿ使得紅色,藍色和黃色的不平等,以及不平等X 0和ÿ 0,是滿意的。同時,您的解決方案必須對應於z的最大可能值。
您需要找到的自變數(在本例中為 x 和 y )稱為 決策變數 。要最大化或最小化的決策變數的函數(在本例中為 z) 稱為 目標函數 、 成本函數 或僅稱為 目標 。您需要滿足的 不等式 稱為 不等式約束 。您還可以在稱為 等式約束 的約束中使用方程。
這是您如何可視化問題的方法:
紅線代表的功能2 X + Ý = 20,和它上面的紅色區域示出了紅色不等式不滿足。同樣,藍線是函數 4 x + 5 y = 10,藍色區域被禁止,因為它違反了藍色不等式。黃線是 x + 2 y = 2,其下方的黃色區域是黃色不等式無效的地方。
如果您忽略紅色、藍色和黃色區域,則僅保留灰色區域。灰色區域的每個點都滿足所有約束,是問題的潛在解決方案。該區域稱為 可行域 ,其點為 可行解 。在這種情況下,有無數可行的解決方案。
您想最大化z。對應於最大z的可行解是 最優解 。如果您嘗試最小化目標函數,那麼最佳解決方案將對應於其可行的最小值。
請注意,z是線性的。你可以把它想像成一個三維空間中的平面。這就是為什麼最優解必須在可行區域的 頂點 或角上的原因。在這種情況下,最佳解決方案是紅線和藍線相交的點,稍後您將看到。
有時,可行區域的整個邊緣,甚至整個區域,都可以對應相同的z值。在這種情況下,您有許多最佳解決方案。
您現在已准備好使用綠色顯示的附加等式約束來擴展問題:
方程式 x + 5 y = 15,以綠色書寫,是新的。這是一個等式約束。您可以通過向上一張圖像添加相應的綠線來將其可視化:
現在的解決方案必須滿足綠色等式,因此可行區域不再是整個灰色區域。它是綠線從與藍線的交點到與紅線的交點穿過灰色區域的部分。後一點是解決方案。
如果插入x的所有值都必須是整數的要求,那麼就會得到一個混合整數線性規劃問題,可行解的集合又會發生變化:
您不再有綠線,只有沿線的x值為整數的點。可行解是灰色背景上的綠點,此時最優解離紅線最近。
這三個例子說明了 可行的線性規劃問題 ,因為它們具有有界可行區域和有限解。
如果沒有解,線性規劃問題是 不可行的 。當沒有解決方案可以同時滿足所有約束時,通常會發生這種情況。
例如,考慮如果添加約束x + y 1會發生什麼。那麼至少有一個決策變數(x或y)必須是負數。這與給定的約束x 0 和y 0相沖突。這樣的系統沒有可行的解決方案,因此稱為不可行的。
另一個示例是添加與綠線平行的第二個等式約束。這兩行沒有共同點,因此不會有滿足這兩個約束的解決方案。
一個線性規劃問題是 無界的 ,如果它的可行區域是無界,將溶液不是有限。這意味著您的變數中至少有一個不受約束,可以達到正無窮大或負無窮大,從而使目標也無限大。
例如,假設您採用上面的初始問題並刪除紅色和黃色約束。從問題中刪除約束稱為 放鬆 問題。在這種情況下,x和y不會在正側有界。您可以將它們增加到正無窮大,從而產生無限大的z值。
在前面的部分中,您研究了一個與任何實際應用程序無關的抽象線性規劃問題。在本小節中,您將找到與製造業資源分配相關的更具體和實用的優化問題。
假設一家工廠生產四種不同的產品,第一種產品的日產量為x ₁,第二種產品的產量為x 2,依此類推。目標是確定每種產品的利潤最大化日產量,同時牢記以下條件:
數學模型可以這樣定義:
目標函數(利潤)在條件 1 中定義。人力約束遵循條件 2。對原材料 A 和 B 的約束可以從條件 3 和條件 4 中通過對每種產品的原材料需求求和得出。
最後,產品數量不能為負,因此所有決策變數必須大於或等於零。
與前面的示例不同,您無法方便地將其可視化,因為它有四個決策變數。但是,無論問題的維度如何,原理都是相同的。
在本教程中,您將使用兩個Python 包來解決上述線性規劃問題:
SciPy 設置起來很簡單。安裝後,您將擁有開始所需的一切。它的子包 scipy.optimize 可用於線性和非線性優化。
PuLP 允許您選擇求解器並以更自然的方式表述問題。PuLP 使用的默認求解器是COIN-OR Branch and Cut Solver (CBC)。它連接到用於線性鬆弛的COIN-OR 線性規劃求解器 (CLP)和用於切割生成的COIN-OR 切割生成器庫 (CGL)。
另一個偉大的開源求解器是GNU 線性規劃工具包 (GLPK)。一些著名且非常強大的商業和專有解決方案是Gurobi、CPLEX和XPRESS。
除了在定義問題時提供靈活性和運行各種求解器的能力外,PuLP 使用起來不如 Pyomo 或 CVXOPT 等替代方案復雜,後者需要更多的時間和精力來掌握。
要學習本教程,您需要安裝 SciPy 和 PuLP。下面的示例使用 SciPy 1.4.1 版和 PuLP 2.1 版。
您可以使用pip以下方法安裝兩者:
您可能需要運行pulptest或sudo pulptest啟用 PuLP 的默認求解器,尤其是在您使用 Linux 或 Mac 時:
或者,您可以下載、安裝和使用 GLPK。它是免費和開源的,適用於 Windows、MacOS 和 Linux。在本教程的後面部分,您將看到如何將 GLPK(除了 CBC)與 PuLP 一起使用。
在 Windows 上,您可以下載檔案並運行安裝文件。
在 MacOS 上,您可以使用 Homebrew:
在 Debian 和 Ubuntu 上,使用apt來安裝glpk和glpk-utils:
在Fedora,使用dnf具有glpk-utils:
您可能還會發現conda對安裝 GLPK 很有用:
安裝完成後,可以查看GLPK的版本:
有關詳細信息,請參閱 GLPK 關於使用Windows 可執行文件和Linux 軟體包進行安裝的教程。
在本節中,您將學習如何使用 SciPy優化和求根庫進行線性規劃。
要使用 SciPy 定義和解決優化問題,您需要導入scipy.optimize.linprog():
現在您已經linprog()導入,您可以開始優化。
讓我們首先解決上面的線性規劃問題:
linprog()僅解決最小化(而非最大化)問題,並且不允許具有大於或等於符號 ( ) 的不等式約束。要解決這些問題,您需要在開始優化之前修改您的問題:
引入這些更改後,您將獲得一個新系統:
該系統與原始系統等效,並且將具有相同的解決方案。應用這些更改的唯一原因是克服 SciPy 與問題表述相關的局限性。
下一步是定義輸入值:
您將上述系統中的值放入適當的列表、元組或NumPy 數組中:
注意:請注意行和列的順序!
約束左側和右側的行順序必須相同。每一行代表一個約束。
來自目標函數和約束左側的系數的順序必須匹配。每列對應一個決策變數。
下一步是以與系數相同的順序定義每個變數的界限。在這種情況下,它們都在零和正無窮大之間:
此語句是多餘的,因為linprog()默認情況下採用這些邊界(零到正無窮大)。
註:相反的float("inf"),你可以使用math.inf,numpy.inf或scipy.inf。
最後,是時候優化和解決您感興趣的問題了。你可以這樣做linprog():
參數c是指來自目標函數的系數。A_ub和b_ub分別與不等式約束左邊和右邊的系數有關。同樣,A_eq並b_eq參考等式約束。您可以使用bounds提供決策變數的下限和上限。
您可以使用該參數method來定義要使用的線性規劃方法。有以下三種選擇:
linprog() 返回具有以下屬性的數據結構:
您可以分別訪問這些值:
這就是您獲得優化結果的方式。您還可以以圖形方式顯示它們:
如前所述,線性規劃問題的最優解位於可行區域的頂點。在這種情況下,可行區域只是藍線和紅線之間的綠線部分。最優解是代表綠線和紅線交點的綠色方塊。
如果要排除相等(綠色)約束,只需刪除參數A_eq並b_eq從linprog()調用中刪除:
解決方案與前一種情況不同。你可以在圖表上看到:
在這個例子中,最優解是紅色和藍色約束相交的可行(灰色)區域的紫色頂點。其他頂點,如黃色頂點,具有更高的目標函數值。
您可以使用 SciPy 來解決前面部分所述的資源分配問題:
和前面的例子一樣,你需要從上面的問題中提取必要的向量和矩陣,將它們作為參數傳遞給.linprog(),然後得到結果:
結果告訴您最大利潤是1900並且對應於x ₁ = 5 和x ₃ = 45。在給定條件下生產第二和第四個產品是沒有利潤的。您可以在這里得出幾個有趣的結論:
opt.statusis0和opt.successis True,說明優化問題成功求解,最優可行解。
SciPy 的線性規劃功能主要用於較小的問題。對於更大和更復雜的問題,您可能會發現其他庫更適合,原因如下:
幸運的是,Python 生態系統為線性編程提供了幾種替代解決方案,這些解決方案對於更大的問題非常有用。其中之一是 PuLP,您將在下一節中看到它的實際應用。
PuLP 具有比 SciPy 更方便的線性編程 API。您不必在數學上修改您的問題或使用向量和矩陣。一切都更干凈,更不容易出錯。
像往常一樣,您首先導入您需要的內容:
現在您已經導入了 PuLP,您可以解決您的問題。
您現在將使用 PuLP 解決此系統:
第一步是初始化一個實例LpProblem來表示你的模型:
您可以使用該sense參數來選擇是執行最小化(LpMinimize或1,這是默認值)還是最大化(LpMaximize或-1)。這個選擇會影響你的問題的結果。
一旦有了模型,就可以將決策變數定義為LpVariable類的實例:
您需要提供下限,lowBound=0因為默認值為負無窮大。該參數upBound定義了上限,但您可以在此處省略它,因為它默認為正無窮大。
可選參數cat定義決策變數的類別。如果您使用的是連續變數,則可以使用默認值"Continuous"。
您可以使用變數x和y創建表示線性表達式和約束的其他 PuLP 對象:
當您將決策變數與標量相乘或構建多個決策變數的線性組合時,您會得到一個pulp.LpAffineExpression代表線性表達式的實例。
注意:您可以增加或減少變數或表達式,你可以乘他們常數,因為紙漿類實現一些Python的特殊方法,即模擬數字類型一樣__add__(),__sub__()和__mul__()。這些方法用於像定製運營商的行為+,-和*。
類似地,您可以將線性表達式、變數和標量與運算符 ==、=以獲取表示模型線性約束的紙漿.LpConstraint實例。
註:也有可能與豐富的比較方法來構建的約束.__eq__(),.__le__()以及.__ge__()定義了運營商的行為==,=。
考慮到這一點,下一步是創建約束和目標函數並將它們分配給您的模型。您不需要創建列表或矩陣。只需編寫 Python 表達式並使用+=運算符將它們附加到模型中:
在上面的代碼中,您定義了包含約束及其名稱的元組。LpProblem允許您通過將約束指定為元組來向模型添加約束。第一個元素是一個LpConstraint實例。第二個元素是該約束的可讀名稱。
設置目標函數非常相似:
或者,您可以使用更短的符號:
現在您已經添加了目標函數並定義了模型。
注意:您可以使用運算符將 約束或目標附加到模型中,+=因為它的類LpProblem實現了特殊方法.__iadd__(),該方法用於指定 的行為+=。
對於較大的問題,lpSum()與列表或其他序列一起使用通常比重復+運算符更方便。例如,您可以使用以下語句將目標函數添加到模型中:
它產生與前一條語句相同的結果。
您現在可以看到此模型的完整定義:
模型的字元串表示包含所有相關數據:變數、約束、目標及其名稱。
注意:字元串表示是通過定義特殊方法構建的.__repr__()。有關 的更多詳細信息.__repr__(),請查看Pythonic OOP 字元串轉換:__repr__vs__str__ .
最後,您已准備好解決問題。你可以通過調用.solve()你的模型對象來做到這一點。如果要使用默認求解器 (CBC),則不需要傳遞任何參數:
.solve()調用底層求解器,修改model對象,並返回解決方案的整數狀態,1如果找到了最優解。有關其餘狀態代碼,請參閱LpStatus[]。
你可以得到優化結果作為 的屬性model。該函數value()和相應的方法.value()返回屬性的實際值:
model.objective持有目標函數model.constraints的值,包含鬆弛變數的值,以及對象x和y具有決策變數的最優值。model.variables()返回一個包含決策變數的列表:
如您所見,此列表包含使用 的構造函數創建的確切對象LpVariable。
結果與您使用 SciPy 獲得的結果大致相同。
注意:注意這個方法.solve()——它會改變對象的狀態,x並且y!
您可以通過調用查看使用了哪個求解器.solver:
輸出通知您求解器是 CBC。您沒有指定求解器,因此 PuLP 調用了默認求解器。
如果要運行不同的求解器,則可以將其指定為 的參數.solve()。例如,如果您想使用 GLPK 並且已經安裝了它,那麼您可以solver=GLPK(msg=False)在最後一行使用。請記住,您還需要導入它:
現在你已經導入了 GLPK,你可以在裡面使用它.solve():
該msg參數用於顯示來自求解器的信息。msg=False禁用顯示此信息。如果要包含信息,則只需省略msg或設置msg=True。
您的模型已定義並求解,因此您可以按照與前一種情況相同的方式檢查結果:
使用 GLPK 得到的結果與使用 SciPy 和 CBC 得到的結果幾乎相同。
一起來看看這次用的是哪個求解器:
正如您在上面用突出顯示的語句定義的那樣model.solve(solver=GLPK(msg=False)),求解器是 GLPK。
您還可以使用 PuLP 來解決混合整數線性規劃問題。要定義整數或二進制變數,只需傳遞cat="Integer"或cat="Binary"到LpVariable。其他一切都保持不變:
在本例中,您有一個整數變數並獲得與之前不同的結果:
Nowx是一個整數,如模型中所指定。(從技術上講,它保存一個小數點後為零的浮點值。)這一事實改變了整個解決方案。讓我們在圖表上展示這一點:
如您所見,最佳解決方案是灰色背景上最右邊的綠點。這是兩者的最大價值的可行的解決方案x和y,給它的最大目標函數值。
GLPK 也能夠解決此類問題。
現在你可以使用 PuLP 來解決上面的資源分配問題:
定義和解決問題的方法與前面的示例相同:
在這種情況下,您使用字典 x來存儲所有決策變數。這種方法很方便,因為字典可以將決策變數的名稱或索引存儲為鍵,將相應的LpVariable對象存儲為值。列表或元組的LpVariable實例可以是有用的。
上面的代碼產生以下結果:
如您所見,該解決方案與使用 SciPy 獲得的解決方案一致。最有利可圖的解決方案是每天生產5.0第一件產品和45.0第三件產品。
讓我們把這個問題變得更復雜和有趣。假設由於機器問題,工廠無法同時生產第一種和第三種產品。在這種情況下,最有利可圖的解決方案是什麼?
現在您有另一個邏輯約束:如果x ₁ 為正數,則x ₃ 必須為零,反之亦然。這是二元決策變數非常有用的地方。您將使用兩個二元決策變數y ₁ 和y ₃,它們將表示是否生成了第一個或第三個產品:
除了突出顯示的行之外,代碼與前面的示例非常相似。以下是差異:
這是解決方案:
事實證明,最佳方法是排除第一種產品而只生產第三種產品。
就像有許多資源可以幫助您學習線性規劃和混合整數線性規劃一樣,還有許多具有 Python 包裝器的求解器可用。這是部分列表:
其中一些庫,如 Gurobi,包括他們自己的 Python 包裝器。其他人使用外部包裝器。例如,您看到可以使用 PuLP 訪問 CBC 和 GLPK。
您現在知道什麼是線性規劃以及如何使用 Python 解決線性規劃問題。您還了解到 Python 線性編程庫只是本機求解器的包裝器。當求解器完成其工作時,包裝器返回解決方案狀態、決策變數值、鬆弛變數、目標函數等。
㈥ Python怎麼做最優化
最優化
為什麼要做最優化呢?因為在生活中,人們總是希望幸福值或其它達到一個極值,比如做生意時希望成本最小,收入最大,所以在很多商業情境中,都會遇到求極值的情況。
函數求根
這里「函數的根」也稱「方程的根」,或「函數的零點」。
先把我們需要的包載入進來。import numpy as npimport scipy as spimport scipy.optimize as optimport matplotlib.pyplot as plt%matplotlib inline
函數求根和最優化的關系?什麼時候函數是最小值或最大值?
兩個問題一起回答:最優化就是求函數的最小值或最大值,同時也是極值,在求一個函數最小值或最大值時,它所在的位置肯定是導數為 0 的位置,所以要求一個函數的極值,必然要先求導,使其為 0,所以函數求根就是為了得到最大值最小值。
scipy.optimize 有什麼方法可以求根?
可以用 scipy.optimize 中的 bisect 或 brentq 求根。f = lambda x: np.cos(x) - x # 定義一個匿名函數x = np.linspace(-5, 5, 1000) # 先生成 1000 個 xy = f(x) # 對應生成 1000 個 f(x)plt.plot(x, y); # 看一下這個函數長什麼樣子plt.axhline(0, color='k'); # 畫一根橫線,位置在 y=0
opt.bisect(f, -5, 5) # 求取函數的根0.7390851332155535plt.plot(x, y)plt.axhline(0, color='k')plt.scatter([_], [0], c='r', s=100); # 這里的 [_] 表示上一個 Cell 中的結果,這里是 x 軸上的位置,0 是 y 上的位置
求根有兩種方法,除了上面介紹的 bisect,還有 brentq,後者比前者快很多。%timeit opt.bisect(f, -5, 5)%timeit opt.brentq(f, -5, 5)10000 loops, best of 3: 157 s per loopThe slowest run took 11.65 times longer than the fastest. This could mean that an intermediate result is being cached.10000 loops, best of 3: 35.9 s per loop
函數求最小化
求最小值就是一個最優化問題。求最大值時只需對函數做一個轉換,比如加一個負號,或者取倒數,就可轉成求最小值問題。所以兩者是同一問題。
初始值對最優化的影響是什麼?
舉例來說,先定義個函數。f = lambda x: 1-np.sin(x)/xx = np.linspace(-20., 20., 1000)y = f(x)
當初始值為 3 值,使用 minimize 函數找到最小值。minimize 函數是在新版的 scipy 里,取代了以前的很多最優化函數,是個通用的介面,背後是很多方法在支撐。x0 = 3xmin = opt.minimize(f, x0).x # x0 是起始點,起始點最好離真正的最小值點不要太遠plt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300); # 起始點畫出來,用圓圈表示plt.scatter(xmin, f(xmin), marker='v', s=300); # 最小值點畫出來,用三角表示plt.xlim(-20, 20);
初始值為 3 時,成功找到最小值。
現在來看看初始值為 10 時,找到的最小值點。x0 = 10xmin = opt.minimize(f, x0).xplt.plot(x, y)plt.scatter(x0, f(x0), marker='o', s=300)plt.scatter(xmin, f(xmin), marker='v', s=300)plt.xlim(-20, 20);
由上圖可見,當初始值為 10 時,函數找到的是局部最小值點,可見 minimize 的默認演算法對起始點的依賴性。
那麼怎麼才能不管初始值在哪個位置,都能找到全局最小值點呢?
如何找到全局最優點?
可以使用 basinhopping 函數找到全局最優點,相關背後演算法,可以看幫助文件,有提供論文的索引和出處。
我們設初始值為 10 看是否能找到全局最小值點。x0 = 10from scipy.optimize import basinhoppingxmin = basinhopping(f,x0,stepsize = 5).xplt.plot(x, y);plt.scatter(x0, f(x0), marker='o', s=300);plt.scatter(xmin, f(xmin), marker='v', s=300);plt.xlim(-20, 20);
當起始點在比較遠的位置,依然成功找到了全局最小值點。
如何求多元函數最小值?
以二元函數為例,使用 minimize 求對應的最小值。def g(X): x,y = X return (x-1)**4 + 5 * (y-1)**2 - 2*x*yX_opt = opt.minimize(g, (8, 3)).x # (8,3) 是起始點print X_opt[ 1.88292611 1.37658521]fig, ax = plt.subplots(figsize=(6, 4)) # 定義畫布和圖形x_ = y_ = np.linspace(-1, 4, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, g((X, Y)), 50) # 等高線圖ax.plot(X_opt[0], X_opt[1], 'r*', markersize=15) # 最小點的位置是個元組ax.set_xlabel(r"$x_1$", fontsize=18)ax.set_ylabel(r"$x_2$", fontsize=18)plt.colorbar(c, ax=ax) # colorbar 表示顏色越深,高度越高fig.tight_layout()
畫3D 圖。from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmfig = plt.figure()ax = fig.gca(projection='3d')x_ = y_ = np.linspace(-1, 4, 100)X, Y = np.meshgrid(x_, y_)surf = ax.plot_surface(X, Y, g((X,Y)), rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)cset = ax.contour(X, Y, g((X,Y)), zdir='z',offset=-5, cmap=cm.coolwarm)fig.colorbar(surf, shrink=0.5, aspect=5);
曲線擬合
曲線擬合和最優化有什麼關系?
曲線擬合的問題是,給定一組數據,它可能是沿著一條線散布的,這時要找到一條最優的曲線來擬合這些數據,也就是要找到最好的線來代表這些點,這里的最優是指這些點和線之間的距離是最小的,這就是為什麼要用最優化問題來解決曲線擬合問題。
舉例說明,給一些點,找到一條線,來擬合這些點。
先給定一些點:N = 50 # 點的個數m_true = 2 # 斜率b_true = -1 # 截距dy = 2.0 # 誤差np.random.seed(0)xdata = 10 * np.random.random(N) # 50 個 x,服從均勻分布ydata = np.random.normal(b_true + m_true * xdata, dy) # dy 是標准差plt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');
上面的點整體上呈現一個線性關系,要找到一條斜線來代表這些點,這就是經典的一元線性回歸。目標就是找到最好的線,使點和線的距離最短。要優化的函數是點和線之間的距離,使其最小。點是確定的,而線是可變的,線是由參數值,斜率和截距決定的,這里就是要通過優化距離找到最優的斜率和截距。
點和線的距離定義如下:def chi2(theta, x, y): return np.sum(((y - theta[0] - theta[1] * x)) ** 2)
上式就是誤差平方和。
誤差平方和是什麼?有什麼作用?
誤差平方和公式為:
誤差平方和大,表示真實的點和預測的線之間距離太遠,說明擬合得不好,最好的線,應該是使誤差平方和最小,即最優的擬合線,這里是條直線。
誤差平方和就是要最小化的目標函數。
找到最優的函數,即斜率和截距。theta_guess = [0, 1] # 初始值theta_best = opt.minimize(chi2, theta_guess, args=(xdata, ydata)).xprint(theta_best)[-1.01442005 1.93854656]
上面兩個輸出即是預測的直線斜率和截距,我們是根據點來反推直線的斜率和截距,那麼真實的斜率和截距是多少呢?-1 和 2,很接近了,差的一點是因為有噪音的引入。xfit = np.linspace(0, 10)yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');
最小二乘(Least Square)是什麼?
上面用的是 minimize 方法,這個問題的目標函數是誤差平方和,這就又有一個特定的解法,即最小二乘。
最小二乘的思想就是要使得觀測點和估計點的距離的平方和達到最小,這里的「二乘」指的是用平方來度量觀測點與估計點的遠近(在古漢語中「平方」稱為「二乘」),「最小」指的是參數的估計值要保證各個觀測點與估計點的距離的平方和達到最小。
關於最小二乘估計的計算,涉及更多的數學知識,這里不想詳述,其一般的過程是用目標函數對各參數求偏導數,並令其等於 0,得到一個線性方程組。具體推導過程可參考斯坦福機器學習講義 第 7 頁。def deviations(theta, x, y): return (y - theta[0] - theta[1] * x)theta_best, ier = opt.leastsq(deviations, theta_guess, args=(xdata, ydata))print(theta_best)[-1.01442016 1.93854659]
最小二乘 leastsq 的結果跟 minimize 結果一樣。注意 leastsq 的第一個參數不再是誤差平方和 chi2,而是誤差本身 deviations,即沒有平方,也沒有和。yfit = theta_best[0] + theta_best[1] * xfitplt.errorbar(xdata, ydata, dy, fmt='.k', ecolor='lightgray');plt.plot(xfit, yfit, '-k');
非線性最小二乘
上面是給一些點,擬合一條直線,擬合一條曲線也是一樣的。def f(x, beta0, beta1, beta2): # 首先定義一個非線性函數,有 3 個參數 return beta0 + beta1 * np.exp(-beta2 * x**2)beta = (0.25, 0.75, 0.5) # 先猜 3 個 betaxdata = np.linspace(0, 5, 50)y = f(xdata, *beta)ydata = y + 0.05 * np.random.randn(len(xdata)) # 給 y 加噪音def g(beta): return ydata - f(xdata, *beta) # 真實 y 和 預測值的差,求最優曲線時要用到beta_start = (1, 1, 1)beta_opt, beta_cov = opt.leastsq(g, beta_start)print beta_opt # 求到的 3 個最優的 beta 值[ 0.25525709 0.74270226 0.54966466]
拿估計的 beta_opt 值跟真實的 beta = (0.25, 0.75, 0.5) 值比較,差不多。fig, ax = plt.subplots()ax.scatter(xdata, ydata) # 畫點ax.plot(xdata, y, 'r', lw=2) # 真實值的線ax.plot(xdata, f(xdata, *beta_opt), 'b', lw=2) # 擬合的線ax.set_xlim(0, 5)ax.set_xlabel(r"$x$", fontsize=18)ax.set_ylabel(r"$f(x, \beta)$", fontsize=18)fig.tight_layout()
除了使用最小二乘,還可以使用曲線擬合的方法,得到的結果是一樣的。beta_opt, beta_cov = opt.curve_fit(f, xdata, ydata)print beta_opt[ 0.25525709 0.74270226 0.54966466]
有約束的最小化
有約束的最小化是指,要求函數最小化之外,還要滿足約束條件,舉例說明。
邊界約束def f(X): x, y = X return (x-1)**2 + (y-1)**2 # 這是一個碗狀的函數x_opt = opt.minimize(f, (0, 0), method='BFGS').x # 無約束最優化
假設有約束條件,x 和 y 要在一定的范圍內,如 x 在 2 到 3 之間,y 在 0 和 2 之間。bnd_x1, bnd_x2 = (2, 3), (0, 2) # 對自變數的約束x_cons_opt = opt.minimize(f, np.array([0, 0]), method='L-BFGS-B', bounds=[bnd_x1, bnd_x2]).x # bounds 矩形約束fig, ax = plt.subplots(figsize=(6, 4))x_ = y_ = np.linspace(-1, 3, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, f((X,Y)), 50)ax.plot(x_opt[0], x_opt[1], 'b*', markersize=15) # 沒有約束下的最小值,藍色五角星ax.plot(x_cons_opt[0], x_cons_opt[1], 'r*', markersize=15) # 有約束下的最小值,紅色星星bound_rect = plt.Rectangle((bnd_x1[0], bnd_x2[0]), bnd_x1[1] - bnd_x1[0], bnd_x2[1] - bnd_x2[0], facecolor="grey")ax.add_patch(bound_rect)ax.set_xlabel(r"$x_1$", fontsize=18)ax.set_ylabel(r"$x_2$", fontsize=18)plt.colorbar(c, ax=ax)fig.tight_layout()
不等式約束
介紹下相關理論,先來看下存在等式約束的極值問題求法,比如下面的優化問題。
目標函數是 f(w),下面是等式約束,通常解法是引入拉格朗日運算元,這里使用 ββ 來表示運算元,得到拉格朗日公式為
l 是等式約束的個數。
然後分別對 w 和ββ 求偏導,使得偏導數等於 0,然後解出 w 和βiβi,至於為什麼引入拉格朗日運算元可以求出極值,原因是 f(w) 的 dw 變化方向受其他不等式的約束,dw的變化方向與f(w)的梯度垂直時才能獲得極值,而且在極值處,f(w) 的梯度與其他等式梯度的線性組合平行,因此他們之間存在線性關系。(參考《最優化與KKT條件》)
對於不等式約束的極值問題
常常利用拉格朗日對偶性將原始問題轉換為對偶問題,通過解對偶問題而得到原始問題的解。該方法應用在許多統計學習方法中。有興趣的可以參閱相關資料,這里不再贅述。def f(X): return (X[0] - 1)**2 + (X[1] - 1)**2def g(X): return X[1] - 1.75 - (X[0] - 0.75)**4x_opt = opt.minimize(f, (0, 0), method='BFGS').xconstraints = [dict(type='ineq', fun=g)] # 約束採用字典定義,約束方式為不等式約束,邊界用 g 表示x_cons_opt = opt.minimize(f, (0, 0), method='SLSQP', constraints=constraints).xfig, ax = plt.subplots(figsize=(6, 4))x_ = y_ = np.linspace(-1, 3, 100)X, Y = np.meshgrid(x_, y_)c = ax.contour(X, Y, f((X, Y)), 50)ax.plot(x_opt[0], x_opt[1], 'b*', markersize=15) # 藍色星星,沒有約束下的最小值ax.plot(x_, 1.75 + (x_-0.75)**4, '', markersize=15)ax.fill_between(x_, 1.75 + (x_-0.75)**4, 3, color="grey")ax.plot(x_cons_opt[0], x_cons_opt[1], 'r*', markersize=15) # 在區域約束下的最小值ax.set_ylim(-1, 3)ax.set_xlabel(r"$x_0$", fontsize=18)ax.set_ylabel(r"$x_1$", fontsize=18)plt.colorbar(c, ax=ax)fig.tight_layout()
scipy.optimize.minimize 中包括了多種最優化演算法,每種演算法使用范圍不同,詳細參考官方文檔。
㈦ 單純形表法求解目標函數最小值時,有兩個非基變數的負檢驗數相同,如何選擇入基變數
因為基本可行解的個數有限,故經有限次轉換必能得出問題的最優解。從線性方程組找出一個個的單純形,每一個單純形可以求得一組解,然後再判斷該解使目標函數值是增大還是變小了,決定下一步選擇的單純形。通過優化迭代,直到目標函數實現最大或最小值。如果線性問題存在最優解,一定有一個基可行解是有最優解。因此單純形法迭代的基本思路是:先找出一個基可行解,判斷其是否為最優解。如為否,則轉換到相鄰的基可行解,並使目標函數值不斷增大,一直找到最優解為止。(7)python解線性方程組擴展閱讀:由於目標函數和約束條件內容和形式上的差別,線性規劃問題可以有多種表達式。因此,為了便於討論和制定統一的演算法,在制定單純形法時,規定使用單純形法求解的線性規劃問題需要有一個標准形式,它有下面三個特徵:(1) 標准形式目標函數統一為求極大值或極小值,但單純形法主要用來求解極大值;(2) 所有約束條件(除非負條件外)都是等式,約束條件右端常數項bi全為非負值;(3) 所有變數的取值全為非負值。
搜索
免費python全套教程
python必背100源代碼
編程入門教程300例
初學編程100個簡單教程
初中數學全套解題技巧
編程必背50個程序
㈧ C++ opencv曲線擬合
簡介:此問題是在做旋轉模板匹配的時候,選擇最好的匹配結果時產生的。查找資料發現多項式擬合問題可以變成一個超定方程的求解問題,而opencv中本身有一個cv::solve()函數可以求解線性方程組,因此對於大多數用到opencv又要進行曲線擬合的地方都可以參考此處的求解過程來解決。
原始數據是一些離散的散點,下圖是用matplotlib的plot方法畫出來的,我想得到下圖中最高處附近的近似的曲線方程,以得到一個最大值和最大值對應的橫坐標。從下圖看,在最高處附近很像一條拋物線,那就用2次函數去擬合最高處附近的曲線看看效果
二次函數的一般形式為 ,二次函數由 完全決定,這樣只需要三組 的數據我們就可以求出 的表達式。例如現在我們獲得了三組數據, ,寫成方程組的形式就是
求解這個線性方程組就可以得到我們需要的二次方程,很容易求出來 。
在實際的情況下我們觀測獲得的數據並不是絕對准確的,也就是存在偏差,當數據足夠多時就可以去除很大一部分隨機誤差,但是當方程數超過未知數的個數時,怎麼求解呢?這就要引入下面 超定方程 的知識了。
設方程Ax = b.根據有效的方程個數和未知數的個數,可以分為以下3種情況:
設方程組 中, , 是 維已知向量, 是n維解向量,當 ,即方程個數大於自變數個數時,稱此方程組為超定方程組。
記 ,稱使 最小的解 為方程組 的最小二乘解。
是 的最小二乘解的充要條件是: 是 的解。
, ,
構造 ,求解此線性方程組就可以得到最小二乘解,也就得到我們需要的二次方程了。
可以和python實現版對照著看最後擬合的方程是一樣的!完美!
參考:
超定方程理論參考: https://blog.csdn.net/u014652390/article/details/52789591
㈨ 用MATLAB求解線性方程組解的方差陣
本人使用Python編程求最小二乘問題解得以下結果
x=[ -3.52600181e-06, 1.05613278e+02, -6.32534301e+01,
2.13574439e+02, -1.12594750e+01, 2.46124268e+01,
-1.19712190e+00, 2.49220346e-02, -1.87255444e-04,
8.69844609e+01, -2.06283690e-02],
殘差=[ 0.02367883],
A的秩11,
A的奇異值=[ 5.50618827e+06, 4.26972794e+03, 1.30077642e+02,
5.82579037e+00, 1.14228947e+00, 9.99923434e-01,
1.36385035e-01, 2.65709448e-02, 4.01400241e-03,
1.77324993e-03, 6.67012472e-05]
希望可以幫你下
在MATLAB中編程也ok
㈩ 這題怎麼只用一個X來設方程不許用兩個,只能用一個X來設
設大人有x個人,則小孩有100-x個人。故按照題設可知
3x+(100-x)/3=100
9x+100-x=300
8x=200
x=25
故大人有25人,小孩有100-25=75人