您好,很高興為您服務(wù)。
成都創(chuàng)新互聯(lián)"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營(yíng)銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動(dòng)網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營(yíng)銷需求!成都創(chuàng)新互聯(lián)具備承接各種類型的成都做網(wǎng)站、成都網(wǎng)站建設(shè)項(xiàng)目的能力。經(jīng)過十余年的努力的開拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶的一致好評(píng)。
關(guān)于您提到的ujson安裝問題,我能為您提供一些幫助。首先,您需要確認(rèn)自己的Python版本,因?yàn)閡json的版本與Python版本有關(guān)。如果您的Python版本是2.7,那么您可以使用pip來安裝ujson,命令如下:pip install ujson。如果您的Python版本是3.x,那么您可以使用pip3來安裝ujson,命令如下:pip3 install ujson。
此外,您也可以從Python官網(wǎng)上下載ujson的源碼,然后自行編譯安裝。您可以在Python官網(wǎng)上搜索“ujson”,找到ujson的源碼,下載后解壓,然后運(yùn)行python setup.py install來安裝ujson。
最后,您也可以從第三方網(wǎng)站上下載ujson的安裝包,然后使用pip或pip3來安裝。您可以在網(wǎng)上搜索“ujson安裝包”,找到相應(yīng)的安裝包,下載后使用pip或pip3來安裝即可。
總之,您可以根據(jù)自己的需要,選擇以上任意一種方式來安裝ujson。我希望我的回答能夠幫助您解決您的問題。
在操作文件的時(shí)候,我們肯定是要使用到 os 模塊的,但是 os 模塊里面還有 path 模塊,這個(gè)模塊主要是用來獲取文件的屬性的。這篇博客來分享一下 path 模塊的函數(shù),希望對(duì)學(xué)習(xí) Python 的小伙伴有所幫助。
返回絕對(duì)路徑:
返回文件名:
返回list(多個(gè)路徑)中,所有path共有的最長(zhǎng)的路徑:
返回文件路徑:
路徑存在則返回True,路徑損壞返回False:
路徑存在則返回True,路徑損壞也返回True:
把path中包含的" "和" user"轉(zhuǎn)換成用戶目錄:
根據(jù)環(huán)境變量的值替換path中包含的" {name}":
返回最近訪問時(shí)間(浮點(diǎn)型秒數(shù)):
返回最近文件修改時(shí)間:
返回文件 path 創(chuàng)建時(shí)間:
返回文件大小,如果文件不存在就返回錯(cuò)誤:
判斷是否為絕對(duì)路徑:
判斷路徑是否為文件:
判斷路徑是否為目錄:
判斷路徑是否為鏈接:
判斷路徑是否為掛載點(diǎn):
把目錄和文件名合成一個(gè)路徑:
轉(zhuǎn)換path的大小寫和斜杠:
規(guī)范path字符串形式:
返回path的真實(shí)路徑:
從start開始計(jì)算相對(duì)路徑:
判斷目錄或文件是否相同:
判斷fp1和fp2是否指向同一文件:
判斷stat tuple stat1和stat2是否指向同一個(gè)文件:
把路徑分割成 dirname 和 basename,返回一個(gè)元組:
一般用在 windows 下,返回驅(qū)動(dòng)器名和路徑組成的元組:
分割路徑中的文件名與拓展名:
把路徑分割為加載點(diǎn)與文件:
遍歷path,進(jìn)入每個(gè)目錄都調(diào)用visit函數(shù),visit函數(shù)必須有3個(gè)參數(shù)(arg, dirname, names),dirname表示當(dāng)前目錄的目錄名,names代表當(dāng)前目錄下的所有文件名,args則為walk的第三個(gè)參數(shù):
設(shè)置是否支持unicode路徑名:
那個(gè)就是上面式子的實(shí)部和虛部分開寫的得到兩個(gè)方程。求頻率w的時(shí)候先利用虛部的方程得到w的值。再帶入實(shí)部的方程中求得k值在時(shí)域分析中已經(jīng)看到,控制系統(tǒng)的性能取決于系統(tǒng)的閉環(huán)傳遞函數(shù),因此,可以根據(jù)系統(tǒng)閉環(huán)傳遞函數(shù)的零、極點(diǎn)研究控制系統(tǒng)性能。但對(duì)于高階系統(tǒng),采用解析法求取系統(tǒng)的閉環(huán)特征方程根(閉環(huán)極點(diǎn))通常是比較困難的,且當(dāng)系統(tǒng)某一參數(shù)(如開環(huán)增益)發(fā)生變化時(shí),又需要重新計(jì)算,這就給系統(tǒng)分析帶來很大的不便。
1948年,伊萬思根據(jù)反饋系統(tǒng)中開、閉環(huán)傳遞函數(shù)間的內(nèi)在聯(lián)系,提出了求解閉環(huán)特征方程根的比較簡(jiǎn)易的圖解方法,這種方法稱為根軌跡法。因?yàn)楦壽E法直觀形象,所以在控制工程中獲得了廣泛應(yīng)用。根軌跡是當(dāng)開環(huán)系統(tǒng)某一參數(shù)(如根軌跡增益 )從零變化到無窮時(shí),閉環(huán)特征方程的根在S平面上移動(dòng)的軌跡。根軌跡增益K * 是首1形式開環(huán)傳遞函數(shù)對(duì)應(yīng)的系數(shù)。
?
在介紹圖解法之前,先用直接求根的方法來說明根軌跡的含義。控制系統(tǒng)如上圖所示。其開環(huán)傳遞函數(shù)為:利用計(jì)算結(jié)果在S平面上描點(diǎn)并用平滑曲線將其連接,便得到K * (或K)從零變化到無窮大時(shí)閉環(huán)極點(diǎn)在S平面上移動(dòng)的軌跡,即根軌跡,如下圖所示。圖中,根軌跡用粗實(shí)線表示,箭頭表示K * (或K)增大時(shí)兩條根軌跡移動(dòng)的方向根軌跡的概念
開環(huán)系統(tǒng)某一參數(shù)從零變換到無窮,閉環(huán)系統(tǒng)特征方程式的根在s平面上變化的軌跡。其中某一參數(shù)主要是指根軌跡增益,當(dāng)然也可以是系統(tǒng)中其他的實(shí)參數(shù)。
根軌跡方程
?
將上式寫為相角及模值條件,根據(jù)這兩個(gè)條件可以完全確定s平面上的根軌跡和根軌跡上的K*值。
?
根軌跡與系統(tǒng)性能
1 穩(wěn)定性
當(dāng)參數(shù)由零變化到無窮時(shí),根軌跡不會(huì)越過虛軸進(jìn)入s右半平面則說明系統(tǒng)對(duì)于所有的K值都是穩(wěn)定的,如果根軌跡越過虛軸進(jìn)入s右半平面,則系統(tǒng)進(jìn)入不穩(wěn)定的狀態(tài)。
2穩(wěn)態(tài)特性
一般情況下,根軌跡圖上標(biāo)注的參數(shù)不是開環(huán)增益而是根軌跡增益,根軌跡增益與穩(wěn)態(tài)誤差系數(shù)之間僅相差一個(gè)比例常數(shù),
3動(dòng)態(tài)特性
當(dāng)所有閉環(huán)極點(diǎn)都位于實(shí)軸上時(shí),系統(tǒng)為過阻尼系統(tǒng);
當(dāng)極點(diǎn)重合時(shí),系統(tǒng)為臨界阻尼系統(tǒng);
當(dāng)閉環(huán)極點(diǎn)為共軛復(fù)數(shù)極點(diǎn),系統(tǒng)為欠阻尼系統(tǒng),單位階躍響應(yīng)是衰減振蕩過程,且超調(diào)量將隨著K值的增大而增大。
確定閉環(huán)系統(tǒng)的零極點(diǎn)
當(dāng)根軌跡增益確定時(shí),傳遞函數(shù)也同時(shí)確定下來了,那么閉環(huán)系統(tǒng)的零極點(diǎn)位置就在根軌跡上確定下來了,通過位置可以判斷系統(tǒng)的穩(wěn)定性能。
打開CSDN,閱讀體驗(yàn)更佳
matlab求系統(tǒng)根軌跡和系統(tǒng)增益,控制系統(tǒng)的根軌跡分析
一、根軌跡分析方法的概念所謂根軌跡是指,當(dāng)開環(huán)系統(tǒng)某一參數(shù)從零變到無窮大時(shí),閉環(huán)系統(tǒng)特征方程的根在s平面上的軌跡。一般來說,這一參數(shù)選作開環(huán)系統(tǒng)的增益K,而在無零極點(diǎn)對(duì)消時(shí),閉環(huán)系統(tǒng)特征方程的根就是閉環(huán)傳遞函數(shù)的極點(diǎn)。根軌跡分析方法是分析和設(shè)計(jì)線性定??刂葡到y(tǒng)的圖解方法,使用十分簡(jiǎn)便。利用它可以對(duì)系統(tǒng)進(jìn)行各種性能分析,1.穩(wěn)定性當(dāng)開環(huán)增益K從零到無窮大變化時(shí),圖中的根軌跡不會(huì)越過虛軸進(jìn)入右半s平面...
繼續(xù)訪問
【自動(dòng)控制原理】根軌跡Root Locus-筆記
重點(diǎn)掌握根的變化規(guī)律。從而設(shè)計(jì)控制器/補(bǔ)償器?!案薄皹O點(diǎn)”(一樣的概念)一階系統(tǒng)比如這個(gè)系統(tǒng)傳遞函數(shù)為,對(duì)這個(gè)系統(tǒng)施加一個(gè)沖擊u(t)=,的Laplace變換=1。所以系統(tǒng)的輸出為,令s+a=0,得“根”P=-a進(jìn)行Laplace的逆變換,得到這個(gè)系統(tǒng)的時(shí)間函數(shù),這里的-a就是它的根當(dāng)a0時(shí),它在時(shí)間軸上的表現(xiàn)為指數(shù)衰減對(duì)于一般的一階系統(tǒng)來說,如果把它的根在復(fù)平面上(橫軸為實(shí)數(shù),豎軸為虛數(shù))表達(dá)出來的話,它一定落在實(shí)軸上,如圖一階函數(shù)的。...
繼續(xù)訪問
?
一階系統(tǒng)開環(huán)傳遞函數(shù)表達(dá)式_古典控制理論(三)根軌跡法(閉環(huán)系統(tǒng))
1 根軌跡與系統(tǒng)性能(1)定義:指系統(tǒng)某一參數(shù)從零變化到無窮大時(shí),閉環(huán)系統(tǒng)特征方程式的根(閉環(huán)極點(diǎn))在s平面上變化的軌跡。 Matlab命令:rlocus(sys),默認(rèn)變化參數(shù)為開環(huán)傳遞函數(shù)的增益k。(2)功能:根軌跡可以直接給出閉環(huán)系統(tǒng)時(shí)間相應(yīng)的全部信息,而且可以指明開環(huán)零、極點(diǎn)應(yīng)該如何變化才能滿足給定的閉環(huán)系統(tǒng)的性能指標(biāo)要求。 根軌跡方法可以求解高階代數(shù)方程的根,實(shí)際上就是解決閉環(huán)特征方程...
繼續(xù)訪問
傳遞函數(shù)根軌跡
根軌跡 以及時(shí)域響應(yīng),自動(dòng)控制,各個(gè)方面的自動(dòng)控制都有用,直接出根軌跡
Simulink模型閉環(huán)傳遞函數(shù)導(dǎo)出及Matlab對(duì)simulink模型進(jìn)行頻域分析(含實(shí)現(xiàn)程序)
Simulink模型閉環(huán)傳遞函數(shù)導(dǎo)出及使用Matlab函數(shù)對(duì)simulink模型進(jìn)行頻域分析,并在文章中給出含實(shí)現(xiàn)程序。
繼續(xù)訪問
?
控制教程 —— 介紹篇:4.根軌跡控制器設(shè)計(jì)
在本教程中,我們將介紹根軌跡,展示如何使用MATLAB來創(chuàng)建根軌跡,并演示如何通過使用根軌跡來設(shè)計(jì)滿足某些性能指標(biāo)的反饋控制器。 本教程中使用的主要MATLAB命令包括:feedback,rlocus,step,controlSystemDesigner。 閉環(huán)極點(diǎn) 開環(huán)傳遞函數(shù) H(s)H(s)H(s) 的根軌跡通常是在比例增益 KKK 在0到 ∞\infty∞ 變化時(shí),形成的閉環(huán)極點(diǎn)的軌跡曲線...
繼續(xù)訪問
?
根軌跡和頻率響應(yīng)
首先我們來了解一下根的定義,在一個(gè)閉環(huán)一階系統(tǒng)中,存在過度函數(shù)G(s)為s的一個(gè)式子,那么它可能會(huì)存在零點(diǎn)和極點(diǎn),說到極點(diǎn)想必大家都非常熟悉了,在此,我們可以理解為“根”=“極點(diǎn)”。根軌跡的畫法呢我簡(jiǎn)單提一下,根軌跡是有開環(huán)極點(diǎn)指向開環(huán)零點(diǎn),從左向右,兩兩對(duì)應(yīng),如果缺少對(duì)應(yīng)的,則以無窮極點(diǎn)/零點(diǎn)代替(舉個(gè)例子,假如只有一個(gè)極點(diǎn),沒有零點(diǎn),那么根軌跡就是由這個(gè)極點(diǎn)指向負(fù)無窮),另外,根軌跡是對(duì)稱于實(shí)軸的,其匯合點(diǎn)和分離點(diǎn)并非重點(diǎn),感興趣的同學(xué)可以自己搜索一下了解一下。最終可由增益的取值范圍判斷系統(tǒng)的穩(wěn)定性。.
繼續(xù)訪問
?
根軌跡和系統(tǒng)參數(shù)的確定
1、根軌跡 前面有講到通過閉環(huán)傳遞函數(shù)的極點(diǎn)分布情況來判斷系統(tǒng)是否穩(wěn)定。當(dāng)然還有些更簡(jiǎn)單的判別方式,例如:勞斯穩(wěn)定性判據(jù)、赫爾維茨穩(wěn)定性判據(jù)等。但都是判斷系統(tǒng)是否穩(wěn)定的,那么怎么判斷系統(tǒng)的穩(wěn)定程度(穩(wěn)定裕度)呢?或者說當(dāng)一個(gè)系統(tǒng)參數(shù) ...
繼續(xù)訪問
?
matlab閉環(huán)傳函的根軌跡,自動(dòng)控制系統(tǒng)的設(shè)計(jì)--基于根軌跡的串聯(lián)校正設(shè)計(jì)
與頻域法相似,利用根軌跡法進(jìn)行系統(tǒng)的設(shè)計(jì)也有兩種方法:1)常規(guī)方法;2)Matlab方法。Matlab的根軌跡方法允許進(jìn)行可視化設(shè)計(jì),具有操作簡(jiǎn)單、界面直觀、交互性好、設(shè)計(jì)效率高等優(yōu)點(diǎn)。目前常用的Matlab設(shè)計(jì)方法有:1)直接編程法;2)Matlab控制工具箱提供的強(qiáng)大的Rltool工具;3)第三方提供的應(yīng)用程序,如CTRLLAB等。本節(jié)在給出根軌跡的設(shè)計(jì)思路的基礎(chǔ)上,將重點(diǎn)介紹第一、二種方法。...
繼續(xù)訪問
?
20200518 如何快速畫出閉環(huán)特征方程的根軌跡
Q: 什么是根軌跡法? A: 給一個(gè)閉環(huán)的特征方程,隨著某一個(gè)參數(shù)變化,閉環(huán)特征方程的根(即閉環(huán)傳遞函數(shù)的極點(diǎn))不斷變化,描述根的變化軌跡的圖叫做根軌跡圖。 Q: 針對(duì)的是開環(huán)系統(tǒng)還是閉環(huán)系統(tǒng)? A: 利用開環(huán)系統(tǒng)的零極點(diǎn)研究閉環(huán)系統(tǒng)的極點(diǎn)(根)。 Q: 開環(huán)傳遞函數(shù)和閉環(huán)傳遞函數(shù)的區(qū)別? A: 閉環(huán)傳遞函數(shù)是G1+GH\frac{G}{1+GH}1+GHG,開環(huán)傳遞函數(shù)是GHGHGH。 Q: 如何快速近似畫出根軌跡? A: 首先介紹不著名的異性相吸理論(瞎編的)。 ......
繼續(xù)訪問
?
繪制課本中的根軌跡圖與零極點(diǎn)分布圖
《信號(hào)與系統(tǒng)》第三版下冊(cè)-鄭君里 例11-8 已知反饋系統(tǒng)結(jié)構(gòu)如圖11-21所示,試?yán)L制其根軌跡圖。 這個(gè)圖繪制的是A(s)F(s)的根軌跡圖,并不是整個(gè)閉環(huán)系統(tǒng)的根軌跡圖,也不是A(s)的根軌跡圖 這道題的解析部分其實(shí)是為了計(jì)算在橫軸上的交匯點(diǎn)。 ---------------------------------------------------------------------------------------------------------------------
繼續(xù)訪問
?
應(yīng)用根軌跡分析系統(tǒng)性能
應(yīng)用根軌跡分析系統(tǒng)性能 本節(jié)通過幾個(gè)實(shí)例簡(jiǎn)要介紹根軌跡方法在分析和設(shè)計(jì)系統(tǒng)中的應(yīng)用。 5.3.1 單參數(shù)設(shè)計(jì) 例 5.4: 已知系統(tǒng)的方框圖如下: 試通過根軌跡方法確定合適的反饋系數(shù) k ,使得系統(tǒng)具有阻尼比為 0.4 的閉環(huán)共軛復(fù)數(shù)極點(diǎn)。 解:由方框圖可得系統(tǒng)的開環(huán)傳遞函數(shù)為:
繼續(xù)訪問
根軌跡分析
應(yīng)用MATLAB進(jìn)行根軌跡分析
繼續(xù)訪問
?
matlab閉環(huán)傳函的根軌跡,開環(huán)傳遞函數(shù)的跟軌跡與虛軸的交點(diǎn)怎么算
大學(xué)自動(dòng)控制原理,已知開環(huán)傳遞函數(shù)求閉環(huán)根軌跡圖中的一個(gè)步驟不懂計(jì)算(求根軌跡與虛軸的交點(diǎn))一個(gè)復(fù)數(shù)等于0,結(jié)果是實(shí)部等于0虛部等于0,這個(gè)太簡(jiǎn)單了吧再問:詳細(xì)點(diǎn)還是不懂再答:-w^3j-6w^2+9wj+k=0,(-w^3+9w)j+(-6w^2+k)=0,得-w^3+9w=0,-6w^2如何matlab畫開環(huán)傳遞函數(shù)的奈奎斯特圖用MATLAB做出奈奎斯特曲線圖%k=10k=10;d=conv(...
繼續(xù)訪問
【自動(dòng)控制原理】 根軌跡法之根軌跡法分析系統(tǒng)性能
本文主要講述了使用根軌跡法分析系統(tǒng)穩(wěn)定性的原理,以及根據(jù)根軌跡設(shè)計(jì)參數(shù)Kg的方法步驟。最后給出了主導(dǎo)極點(diǎn)、偶極子對(duì)和開環(huán)零點(diǎn)對(duì)系統(tǒng)性能的影響
繼續(xù)訪問
?
matlab求系統(tǒng)根軌跡和系統(tǒng)增益,《自動(dòng)控制原理》實(shí)驗(yàn)報(bào)告(線性系統(tǒng)的根軌跡)...
實(shí)驗(yàn)四線性系統(tǒng)的根軌跡一、實(shí)驗(yàn)?zāi)康?.熟悉 MATLAB 用于控制系統(tǒng)中的一些基本編程語句和格式。2.利用 MATLAB 語句繪制系統(tǒng)的根軌跡。3.掌握用根軌跡分析系統(tǒng)性能的圖解方法。4.掌握系統(tǒng)參數(shù)變化對(duì)特征根位置的影響。基礎(chǔ)知識(shí)及 MATLAB函數(shù)根軌跡是指系統(tǒng)的某一參數(shù)從零變到無窮大時(shí),特征方程的根在 s 平面上的變化軌跡。這個(gè)參數(shù)一般選為開環(huán)系統(tǒng)的增益 K 。課本中介紹的手工繪制根軌跡的方...
繼續(xù)訪問
最新發(fā)布 817自動(dòng)控制原理-1-開環(huán)傳遞函數(shù)與閉環(huán)傳遞函數(shù)
首先,開環(huán)傳遞函數(shù)是針對(duì)閉環(huán)系統(tǒng)而言的,而不是指開環(huán)系統(tǒng)的傳遞函數(shù)。eg.輸入作用下的開環(huán)傳遞函數(shù):G(s)=G1H2H3/(1-G2H1)輸入作用下的誤差傳遞函數(shù):R(s)/E(s)=(1-G2H2)/(1-G2H2+G1G2H3)
繼續(xù)訪問
熱門推薦 【自控原理】第四章 根軌跡法
文章目錄A 根軌跡法的基本概念B 根軌跡方程C 繪制根軌跡的法則C.a 根軌跡法則介紹C.b 根軌跡法則(常規(guī)根軌跡)D 利用根軌跡分析系統(tǒng)的方法 引言 閉環(huán)控制系統(tǒng)的穩(wěn)定性和性能指標(biāo)主要由閉環(huán)系統(tǒng)的極點(diǎn)在復(fù)數(shù)平面上的位置決定。 分析和設(shè)計(jì)系統(tǒng)時(shí)確定閉環(huán)極點(diǎn)(即特征根)在復(fù)平 面的位置是十分有意義的: 閉環(huán)系統(tǒng)的極點(diǎn)在復(fù)平面的位置決定了系統(tǒng)的穩(wěn) 定性 系統(tǒng)的性能指標(biāo)也主要由閉環(huán)極點(diǎn)的位置決定 ...
繼續(xù)訪問
?
matlab-自控原理 rlocus 根軌跡 根據(jù)傳遞函數(shù)畫圖
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn) ...
繼續(xù)訪問
其他
?寫評(píng)論
?
評(píng)論
?
1
?
點(diǎn)贊
?
踩
?
分享
前往CSDN APP閱讀全文
閱讀體驗(yàn)更佳
?
CSDN
成就一億技術(shù)人
前往
?
夸克瀏覽器
根軌跡的概念
開環(huán)系統(tǒng)某一參數(shù)從零變換到無窮,閉環(huán)系統(tǒng)特征方程式的根在s平面上變化的軌跡。其中某一參數(shù)主要是指根軌跡增益,當(dāng)然也可以是系統(tǒng)中其他的實(shí)參數(shù)。
根軌跡方程
?
將上式寫為相角及模值條件,根據(jù)這兩個(gè)條件可以完全確定s平面上的根軌跡和根軌跡上的K*值。
?
根軌跡與系統(tǒng)性能
1 穩(wěn)定性
當(dāng)參數(shù)由零變化到無窮時(shí),根軌跡不會(huì)越過虛軸進(jìn)入s右半平面則說明系統(tǒng)對(duì)于所有的K值都是穩(wěn)定的,如果根軌跡越過虛軸進(jìn)入s右半平面,則系統(tǒng)進(jìn)入不穩(wěn)定的狀態(tài)。
2穩(wěn)態(tài)特性
一般情況下,根軌跡圖上標(biāo)注的參數(shù)不是開環(huán)增益而是根軌跡增益,根軌跡增益與穩(wěn)態(tài)誤差系數(shù)之間僅相差一個(gè)比例常數(shù),
3動(dòng)態(tài)特性
當(dāng)所有閉環(huán)極點(diǎn)都位于實(shí)軸上時(shí),系統(tǒng)為過阻尼系統(tǒng);
當(dāng)極點(diǎn)重合時(shí),系統(tǒng)為臨界阻尼系統(tǒng);
當(dāng)閉環(huán)極點(diǎn)為共軛復(fù)數(shù)極點(diǎn),系統(tǒng)為欠阻尼系統(tǒng),單位階躍響應(yīng)是衰減振蕩過程,且超調(diào)量將隨著K值的增大而增大。
確定閉環(huán)系統(tǒng)的零極點(diǎn)
當(dāng)根軌跡增益確定時(shí),傳遞函數(shù)也同時(shí)確定下來了,那么閉環(huán)系統(tǒng)的零極點(diǎn)位置就在根軌跡上確定下來了,通過位置可以判斷系統(tǒng)的穩(wěn)定性能。
打開CSDN,閱讀體驗(yàn)更佳
matlab求系統(tǒng)根軌跡和系統(tǒng)增益,控制系統(tǒng)的根軌跡分析
一、根軌跡分析方法的概念所謂根軌跡是指,當(dāng)開環(huán)系統(tǒng)某一參數(shù)從零變到無窮大時(shí),閉環(huán)系統(tǒng)特征方程的根在s平面上的軌跡。一般來說,這一參數(shù)選作開環(huán)系統(tǒng)的增益K,而在無零極點(diǎn)對(duì)消時(shí),閉環(huán)系統(tǒng)特征方程的根就是閉環(huán)傳遞函數(shù)的極點(diǎn)。根軌跡分析方法是分析和設(shè)計(jì)線性定??刂葡到y(tǒng)的圖解方法,使用十分簡(jiǎn)便。利用它可以對(duì)系統(tǒng)進(jìn)行各種性能分析,1.穩(wěn)定性當(dāng)開環(huán)增益K從零到無窮大變化時(shí),圖中的根軌跡不會(huì)越過虛軸進(jìn)入右半s平面...
繼續(xù)訪問
【自動(dòng)控制原理】根軌跡Root Locus-筆記
重點(diǎn)掌握根的變化規(guī)律。從而設(shè)計(jì)控制器/補(bǔ)償器?!案薄皹O點(diǎn)”(一樣的概念)一階系統(tǒng)比如這個(gè)系統(tǒng)傳遞函數(shù)為,對(duì)這個(gè)系統(tǒng)施加一個(gè)沖擊u(t)=,的Laplace變換=1。所以系統(tǒng)的輸出為,令s+a=0,得“根”P=-a進(jìn)行Laplace的逆變換,得到這個(gè)系統(tǒng)的時(shí)間函數(shù),這里的-a就是它的根當(dāng)a0時(shí),它在時(shí)間軸上的表現(xiàn)為指數(shù)衰減對(duì)于一般的一階系統(tǒng)來說,如果把它的根在復(fù)平面上(橫軸為實(shí)數(shù),豎軸為虛數(shù))表達(dá)出來的話,它一定落在實(shí)軸上,如圖一階函數(shù)的。...
繼續(xù)訪問
?
一階系統(tǒng)開環(huán)傳遞函數(shù)表達(dá)式_古典控制理論(三)根軌跡法(閉環(huán)系統(tǒng))
1 根軌跡與系統(tǒng)性能(1)定義:指系統(tǒng)某一參數(shù)從零變化到無窮大時(shí),閉環(huán)系統(tǒng)特征方程式的根(閉環(huán)極點(diǎn))在s平面上變化的軌跡。 Matlab命令:rlocus(sys),默認(rèn)變化參數(shù)為開環(huán)傳遞函數(shù)的增益k。(2)功能:根軌跡可以直接給出閉環(huán)系統(tǒng)時(shí)間相應(yīng)的全部信息,而且可以指明開環(huán)零、極點(diǎn)應(yīng)該如何變化才能滿足給定的閉環(huán)系統(tǒng)的性能指標(biāo)要求。 根軌跡方法可以求解高階代數(shù)方程的根,實(shí)際上就是解決閉環(huán)特征方程...
繼續(xù)訪問
傳遞函數(shù)根軌跡
根軌跡 以及時(shí)域響應(yīng),自動(dòng)控制,各個(gè)方面的自動(dòng)控制都有用,直接出根軌跡
Simulink模型閉環(huán)傳遞函數(shù)導(dǎo)出及Matlab對(duì)simulink模型進(jìn)行頻域分析(含實(shí)現(xiàn)程序)
Simulink模型閉環(huán)傳遞函數(shù)導(dǎo)出及使用Matlab函數(shù)對(duì)simulink模型進(jìn)行頻域分析,并在文章中給出含實(shí)現(xiàn)程序。
繼續(xù)訪問
?
控制教程 —— 介紹篇:4.根軌跡控制器設(shè)計(jì)
在本教程中,我們將介紹根軌跡,展示如何使用MATLAB來創(chuàng)建根軌跡,并演示如何通過使用根軌跡來設(shè)計(jì)滿足某些性能指標(biāo)的反饋控制器。 本教程中使用的主要MATLAB命令包括:feedback,rlocus,step,controlSystemDesigner。 閉環(huán)極點(diǎn) 開環(huán)傳遞函數(shù) H(s)H(s)H(s) 的根軌跡通常是在比例增益 KKK 在0到 ∞\infty∞ 變化時(shí),形成的閉環(huán)極點(diǎn)的軌跡曲線...
繼續(xù)訪問
?
根軌跡和頻率響應(yīng)
首先我們來了解一下根的定義,在一個(gè)閉環(huán)一階系統(tǒng)中,存在過度函數(shù)G(s)為s的一個(gè)式子,那么它可能會(huì)存在零點(diǎn)和極點(diǎn),說到極點(diǎn)想必大家都非常熟悉了,在此,我們可以理解為“根”=“極點(diǎn)”。根軌跡的畫法呢我簡(jiǎn)單提一下,根軌跡是有開環(huán)極點(diǎn)指向開環(huán)零點(diǎn),從左向右,兩兩對(duì)應(yīng),如果缺少對(duì)應(yīng)的,則以無窮極點(diǎn)/零點(diǎn)代替(舉個(gè)例子,假如只有一個(gè)極點(diǎn),沒有零點(diǎn),那么根軌跡就是由這個(gè)極點(diǎn)指向負(fù)無窮),另外,根軌跡是對(duì)稱于實(shí)軸的,其匯合點(diǎn)和分離點(diǎn)并非重點(diǎn),感興趣的同學(xué)可以自己搜索一下了解一下。最終可由增益的取值范圍判斷系統(tǒng)的穩(wěn)定性。.
繼續(xù)訪問
?
根軌跡和系統(tǒng)參數(shù)的確定
1、根軌跡 前面有講到通過閉環(huán)傳遞函數(shù)的極點(diǎn)分布情況來判斷系統(tǒng)是否穩(wěn)定。當(dāng)然還有些更簡(jiǎn)單的判別方式,例如:勞斯穩(wěn)定性判據(jù)、赫爾維茨穩(wěn)定性判據(jù)等。但都是判斷系統(tǒng)是否穩(wěn)定的,那么怎么判斷系統(tǒng)的穩(wěn)定程度(穩(wěn)定裕度)呢?或者說當(dāng)一個(gè)系統(tǒng)參數(shù) ...
繼續(xù)訪問
?
matlab閉環(huán)傳函的根軌跡,自動(dòng)控制系統(tǒng)的設(shè)計(jì)--基于根軌跡的串聯(lián)校正設(shè)計(jì)
與頻域法相似,利用根軌跡法進(jìn)行系統(tǒng)的設(shè)計(jì)也有兩種方法:1)常規(guī)方法;2)Matlab方法。Matlab的根軌跡方法允許進(jìn)行可視化設(shè)計(jì),具有操作簡(jiǎn)單、界面直觀、交互性好、設(shè)計(jì)效率高等優(yōu)點(diǎn)。目前常用的Matlab設(shè)計(jì)方法有:1)直接編程法;2)Matlab控制工具箱提供的強(qiáng)大的Rltool工具;3)第三方提供的應(yīng)用程序,如CTRLLAB等。本節(jié)在給出根軌跡的設(shè)計(jì)思路的基礎(chǔ)上,將重點(diǎn)介紹第一、二種方法。...
繼續(xù)訪問
?
20200518 如何快速畫出閉環(huán)特征方程的根軌跡
Q: 什么是根軌跡法? A: 給一個(gè)閉環(huán)的特征方程,隨著某一個(gè)參數(shù)變化,閉環(huán)特征方程的根(即閉環(huán)傳遞函數(shù)的極點(diǎn))不斷變化,描述根的變化軌跡的圖叫做根軌跡圖。 Q: 針對(duì)的是開環(huán)系統(tǒng)還是閉環(huán)系統(tǒng)? A: 利用開環(huán)系統(tǒng)的零極點(diǎn)研究閉環(huán)系統(tǒng)的極點(diǎn)(根)。 Q: 開環(huán)傳遞函數(shù)和閉環(huán)傳遞函數(shù)的區(qū)別? A: 閉環(huán)傳遞函數(shù)是G1+GH\frac{G}{1+GH}1+GHG,開環(huán)傳遞函數(shù)是GHGHGH。 Q: 如何快速近似畫出根軌跡? A: 首先介紹不著名的異性相吸理論(瞎編的)。 ......
繼續(xù)訪問
?
繪制課本中的根軌跡圖與零極點(diǎn)分布圖
《信號(hào)與系統(tǒng)》第三版下冊(cè)-鄭君里 例11-8 已知反饋系統(tǒng)結(jié)構(gòu)如圖11-21所示,試?yán)L制其根軌跡圖。 這個(gè)圖繪制的是A(s)F(s)的根軌跡圖,并不是整個(gè)閉環(huán)系統(tǒng)的根軌跡圖,也不是A(s)的根軌跡圖 這道題的解析部分其實(shí)是為了計(jì)算在橫軸上的交匯點(diǎn)。 ---------------------------------------------------------------------------------------------------------------------
繼續(xù)訪問
?
應(yīng)用根軌跡分析系統(tǒng)性能
應(yīng)用根軌跡分析系統(tǒng)性能 本節(jié)通過幾個(gè)實(shí)例簡(jiǎn)要介紹根軌跡方法在分析和設(shè)計(jì)系統(tǒng)中的應(yīng)用。 5.3.1 單參數(shù)設(shè)計(jì) 例 5.4: 已知系統(tǒng)的方框圖如下: 試通過根軌跡方法確定合適的反饋系數(shù) k ,使得系統(tǒng)具有阻尼比為 0.4 的閉環(huán)共軛復(fù)數(shù)極點(diǎn)。 解:由方框圖可得系統(tǒng)的開環(huán)傳遞函數(shù)為:
繼續(xù)訪問
根軌跡分析
應(yīng)用MATLAB進(jìn)行根軌跡分析
繼續(xù)訪問
?
matlab閉環(huán)傳函的根軌跡,開環(huán)傳遞函數(shù)的跟軌跡與虛軸的交點(diǎn)怎么算
大學(xué)自動(dòng)控制原理,已知開環(huán)傳遞函數(shù)求閉環(huán)根軌跡圖中的一個(gè)步驟不懂計(jì)算(求根軌跡與虛軸的交點(diǎn))一個(gè)復(fù)數(shù)等于0,結(jié)果是實(shí)部等于0虛部等于0,這個(gè)太簡(jiǎn)單了吧再問:詳細(xì)點(diǎn)還是不懂再答:-w^3j-6w^2+9wj+k=0,(-w^3+9w)j+(-6w^2+k)=0,得-w^3+9w=0,-6w^2如何matlab畫開環(huán)傳遞函數(shù)的奈奎斯特圖用MATLAB做出奈奎斯特曲線圖%k=10k=10;d=conv(...
繼續(xù)訪問
【自動(dòng)控制原理】 根軌跡法之根軌跡法分析系統(tǒng)性能
本文主要講述了使用根軌跡法分析系統(tǒng)穩(wěn)定性的原理,以及根據(jù)根軌跡設(shè)計(jì)參數(shù)Kg的方法步驟。最后給出了主導(dǎo)極點(diǎn)、偶極子對(duì)和開環(huán)零點(diǎn)對(duì)系統(tǒng)性能的影響
繼續(xù)訪問
?
matlab求系統(tǒng)根軌跡和系統(tǒng)增益,《自動(dòng)控制原理》實(shí)驗(yàn)報(bào)告(線性系統(tǒng)的根軌跡)...
實(shí)驗(yàn)四線性系統(tǒng)的根軌跡一、實(shí)驗(yàn)?zāi)康?.熟悉 MATLAB 用于控制系統(tǒng)中的一些基本編程語句和格式。2.利用 MATLAB 語句繪制系統(tǒng)的根軌跡。3.掌握用根軌跡分析系統(tǒng)性能的圖解方法。4.掌握系統(tǒng)參數(shù)變化對(duì)特征根位置的影響?;A(chǔ)知識(shí)及 MATLAB函數(shù)根軌跡是指系統(tǒng)的某一參數(shù)從零變到無窮大時(shí),特征方程的根在 s 平面上的變化軌跡。這個(gè)參數(shù)一般選為開環(huán)系統(tǒng)的增益 K 。課本中介紹的手工繪制根軌跡的方...
繼續(xù)訪問
最新發(fā)布 817自動(dòng)控制原理-1-開環(huán)傳遞函數(shù)與閉環(huán)傳遞函數(shù)
首先,開環(huán)傳遞函數(shù)是針對(duì)閉環(huán)系統(tǒng)而言的,而不是指開環(huán)系統(tǒng)的傳遞函數(shù)。eg.輸入作用下的開環(huán)傳遞函數(shù):G(s)=G1H2H3/(1-G2H1)輸入作用下的誤差傳遞函數(shù):R(s)/E(s)=(1-G2H2)/(1-G2H2+G1G2H3)
繼續(xù)訪問
熱門推薦 【自控原理】第四章 根軌跡法
文章目錄A 根軌跡法的基本概念B 根軌跡方程C 繪制根軌跡的法則C.a 根軌跡法則介紹C.b 根軌跡法則(常規(guī)根軌跡)D 利用根軌跡分析系統(tǒng)的方法 引言 閉環(huán)控制系統(tǒng)的穩(wěn)定性和性能指標(biāo)主要由閉環(huán)系統(tǒng)的極點(diǎn)在復(fù)數(shù)平面上的位置決定。 分析和設(shè)計(jì)系統(tǒng)時(shí)確定閉環(huán)極點(diǎn)(即特征根)在復(fù)平 面的位置是十分有意義的: 閉環(huán)系統(tǒng)的極點(diǎn)在復(fù)平面的位置決定了系統(tǒng)的穩(wěn) 定性 系統(tǒng)的性能指標(biāo)也主要由閉環(huán)極點(diǎn)的位置決定 ...
繼續(xù)訪問
?
matlab-自控原理 rlocus 根軌跡 根據(jù)傳遞函數(shù)畫圖
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn) ...
繼續(xù)訪問
其他
?寫評(píng)論
?
評(píng)論
?
1
?
點(diǎn)贊
?
踩
?
分享
前往CSDN APP閱讀全文
閱讀體驗(yàn)更佳
?
CSDN
成就一億技術(shù)人
前往
?
夸克瀏覽器
在封裝的代碼間傳遞指針你要確保他們運(yùn)行在相同的地址空間里,還要保證指針指向的內(nèi)存的生存期是安全的,否則這種思路就是錯(cuò)誤的。實(shí)現(xiàn)方法舉例如下:
1、定義了C
結(jié)構(gòu)體和函數(shù)如下
typedef
struct
NameAge
{
char
name[20];
int
age;
}NameAge
,
*NameAgePointer;
void
test(NameAgePointer
p)
//
接收結(jié)構(gòu)體指針
{
//
do
something
with
p...
}
2、python定義結(jié)構(gòu)體如下
#python中結(jié)構(gòu)體定義
class
PyStruct():
def
__init__(self,
name,
age):
self.name
=
name
self.age
=
age
fred
=
PyStruct("fred",
5)
3、假設(shè)把第1步里的test封裝成example模塊,python導(dǎo)入example(既然你都會(huì)swig了,這個(gè)過程就不啰嗦了)
import
example
example.test(pointer(fred))
以上是基本思路,因?yàn)榇罱ㄩ_發(fā)環(huán)境和過程比較繁雜,沒有驗(yàn)證過,但是應(yīng)該沒有大問題
此文主要目的,是向大家展示如何才能用python語言,來部署STARK算法。
STARKs(可擴(kuò)容的透明知識(shí)論證)是創(chuàng)建一種證明的技術(shù),這項(xiàng)證明中f(x)=y,其中f可能要花很長(zhǎng)的時(shí)間來進(jìn)行計(jì)算,但是這個(gè)證明可以被很快驗(yàn)證。STARK是“雙重?cái)U(kuò)容”:對(duì)于一個(gè)需要t步驟的計(jì)算,這會(huì)花費(fèi)大約O(t * log(t))步驟才能完成這個(gè)證明,這可能是最優(yōu)的情況,而且這需要通過~O(log2(t))個(gè)步驟才能驗(yàn)證,對(duì)于中等大小的T值,它比原始計(jì)算快得多。STARKs也擁有隱私保護(hù)的“零知識(shí)證明”的特性,雖然我們將這類使用案例應(yīng)用到其中,從而完成可驗(yàn)證的延遲功能,不需要這類性質(zhì),所以我們不用擔(dān)心。
首先,先請(qǐng)幾項(xiàng)說明:
這個(gè)代碼還沒有完全審核;在實(shí)際使用案例中的情況,還不能保證
這部分代碼是還沒有達(dá)到理想狀態(tài)(是用Python語言寫的)
STARKs 的“真實(shí)情況” 傾向于使用二進(jìn)制字段而不是素?cái)?shù)域的特定應(yīng)用程序效率的原因;但是,他們確實(shí)也表現(xiàn)出,這里寫出的代碼是合法并且可用的。
沒有一個(gè)真實(shí)的方法來使用STARK。它是一個(gè)非常寬泛的加密和數(shù)學(xué)架構(gòu),同時(shí)為不同的應(yīng)用有不同的設(shè)置,以及連續(xù)的研究來減少證明者和驗(yàn)證者的復(fù)雜性,同時(shí)提高可用性。
此文希望大家能夠知道,模運(yùn)算和素?cái)?shù)域是如何運(yùn)行的,
并且和多項(xiàng)式概念,插值和估值進(jìn)行結(jié)合。
現(xiàn)在,讓我們一起來了解吧!
MIMC
下面是STARK的功能展示:
def mimc(inp, steps, round_constants): start_time = time.time() for i in range(steps-1): inp = (inp**3 + round_constants[i % len(round_constants)]) % modulus print("MIMC computed in %.4f sec" % (time.time() - start_time)) return inp
我們選擇MIMC作為案例,因?yàn)樗╥)很容易理解,(ii)在真實(shí)世界使用的很多。函數(shù)功能見下圖:
注意:在很多關(guān)于MIMC的討論中,你可以典型地看出使用了XOR,而不是+;這是因?yàn)镸IMC可以在二進(jìn)制情況下使用,其中添加是XOR;這里我們會(huì)在素?cái)?shù)領(lǐng)域進(jìn)行。
在我們的案例中,常數(shù)相對(duì)而言會(huì)是比較小的列表(例如,64位),這會(huì)一直連續(xù)地進(jìn)行周期循環(huán)(也就說,在k[64]之后)。MIMC自身可以獲得這個(gè)特性,因?yàn)镸IMC可以向后進(jìn)行計(jì)算(從相應(yīng)的輸出獲得輸入),但是往后計(jì)算需要比向前計(jì)算多花費(fèi)100倍的時(shí)間(并且沒有方向可以同步進(jìn)行)。所以你可以將往后計(jì)算的功能想象成計(jì)算不能同步的工作量證明,并且往前方向計(jì)算的功能可以作為驗(yàn)證的過程。
x - x(2p-1)/3 是x - x3 的反函數(shù);根據(jù)費(fèi)馬小定理,這是真實(shí)的,盡管這個(gè)定理沒有費(fèi)馬大定理出名,但是依然對(duì)數(shù)學(xué)的貢獻(xiàn)很大。
我們嘗試使用STARK來進(jìn)行更加有效的驗(yàn)證,而不是讓驗(yàn)證者必須在向前方向運(yùn)行MIMC,在完成向后計(jì)算之后,證明者可以在向前方向進(jìn)行STARK計(jì)算,并且驗(yàn)證者可以很簡(jiǎn)單地驗(yàn)證STARK。我們希望計(jì)算STARK可以比MIMC向前和向后之間的運(yùn)行速度差別要小,所以證明者的時(shí)間仍然是有初始的向后計(jì)算來主導(dǎo)的。而并不是STARK計(jì)算。STARK的認(rèn)證會(huì)相對(duì)較快(在python語言算法中,可以是0.05-0.3秒),不論初始的計(jì)算時(shí)間有多長(zhǎng)。
所有的計(jì)算會(huì)在2256 – 351 * 232 + 1個(gè)模內(nèi)完成;我們使用素?cái)?shù)模,因?yàn)樗切∮?256 最大的素?cái)?shù),其中乘法群包含了232 個(gè)子集(也就是說,有這樣一個(gè)數(shù)g,從而在完全232次循環(huán)之后,G素?cái)?shù)環(huán)的連續(xù)冪模繞回到1),而且是按照6k+5的形式。首個(gè)特性是保證FFT和FRI算法的有效版本,其次是保證MIMC實(shí)際上可以向后計(jì)算(請(qǐng)見上面提到的x - x(2p-1)/3 使用方法)。
素域操作
我們通過建立方便的等級(jí)來進(jìn)行素域的操作,同時(shí)也有多項(xiàng)式的操作。代碼如下,收首先是小數(shù)位數(shù):
class PrimeField(): def __init__(self, modulus): # Quick primality test assert pow(2, modulus, modulus) == 2 self.modulus = modulus def add(self, x, y): return (x+y) % self.modulus def sub(self, x, y): return (x-y) % self.modulus def mul(self, x, y): return (x*y) % self.modulus
并且使用擴(kuò)展歐幾里得算法,來計(jì)算模塊逆轉(zhuǎn)(這和在素域中計(jì)算1/x相同):
# Modular inverse using the extended Euclidean algorithm def inv(self, a): if a == 0: return 0 lm, hm = 1, 0 low, high = a % self.modulus, self.modulus while low 1: r = high//low nm, new = hm-lm*r, high-low*r lm, low, hm, high = nm, new, lm, low return lm % self.modulus
上面的算法是相對(duì)昂貴的;幸運(yùn)地是,對(duì)于特定的案例,我們需要做很多的模逆計(jì)算,有一個(gè)數(shù)學(xué)方法可以讓我們來計(jì)算很多逆運(yùn)算,被稱為蒙哥馬利批量求逆:
使用蒙哥馬利批量求逆來計(jì)算模逆,其輸入為紫色,輸出為綠色,乘法門為黑色,紅色方塊是唯一的模逆。
下面的代碼是算法的體現(xiàn),其中包含一些特別的邏輯。如果我們正在求逆的集合中包含零,那么它會(huì)將這些零的逆設(shè)置為 0 并繼續(xù)前進(jìn)。
def multi_inv(self, values): partials = [1] for i in range(len(values)): partials.append(self.mul(partials[-1], values[i] or 1)) inv = self.inv(partials[-1]) outputs = [0] * len(values) for i in range(len(values), 0, -1): outputs[i-1] = self.mul(partials[i-1], inv) if values[i-1] else 0 inv = self.mul(inv, values[i-1] or 1) return outputs
這部分算法接下來會(huì)驗(yàn)證稱為非常重要的東西,特別是當(dāng)我們開始和不同階的多項(xiàng)式進(jìn)行計(jì)算的時(shí)候。
現(xiàn)在我們來看看一些多項(xiàng)式計(jì)算。我們把多項(xiàng)式當(dāng)做一個(gè)數(shù)據(jù)集,其中的i是第i階(例如,x3 + 2x + 1變成[1, 2, 0, 1])。下面就是在一個(gè)點(diǎn)進(jìn)行多項(xiàng)式估算的方法:
# Evaluate a polynomial at a point def eval_poly_at(self, p, x): y = 0 power_of_x = 1 for i, p_coeff in enumerate(p): y += power_of_x * p_coeff power_of_x = (power_of_x * x) % self.modulus return y % self.modulus
困難和挑戰(zhàn)
f.eval_poly_at([4, 5, 6], 2)的輸出是多少?模是31嗎?
下面的解釋就是答案
.其實(shí)也有代碼是多項(xiàng)式加法,減法,乘法和除法;這是很長(zhǎng)的加減乘除運(yùn)算。有一個(gè)很重要的內(nèi)容是拉格朗日插值,它將一組 x 和 y 坐標(biāo)作為輸入,并返回通過所有這些點(diǎn)的最小多項(xiàng)式(你可以將其視為多項(xiàng)式求值的逆):
# Build a polynomial that returns 0 at all specified xs def zpoly(self, xs): root = [1] for x in xs: root.insert(0, 0) for j in range(len(root)-1): root[j] -= root[j+1] * x return [x % self.modulus for x in root] def lagrange_interp(self, xs, ys): # Generate master numerator polynomial, eg. (x - x1) * (x - x2) * ... * (x - xn) root = self.zpoly(xs) # Generate per-value numerator polynomials, eg. for x=x2, # (x - x1) * (x - x3) * ... * (x - xn), by dividing the master # polynomial back by each x coordinate nums = [self.div_polys(root, [-x, 1]) for x in xs] # Generate denominators by evaluating numerator polys at each x denoms = [self.eval_poly_at(nums[i], xs[i]) for i in range(len(xs))] invdenoms = self.multi_inv(denoms) # Generate output polynomial, which is the sum of the per-value numerator # polynomials rescaled to have the right y values b = [0 for y in ys] for i in range(len(xs)): yslice = self.mul(ys[i], invdenoms[i]) for j in range(len(ys)): if nums[i][j] and ys[i]: b[j] += nums[i][j] * yslice return [x % self.modulus for x in b]
相關(guān)數(shù)學(xué)知識(shí)請(qǐng)參見此文的M-N部分。需要注意,我們也會(huì)有特別的方法lagrange_interp_4和lagrange_interp_2來加速次數(shù)小于 2 的拉格朗日插值和次數(shù)小于 4 的多項(xiàng)式運(yùn)算。
快速傅立葉變換
如果你仔細(xì)閱讀上面的算法,你也許會(huì)發(fā)現(xiàn)拉格朗日插值和多點(diǎn)求值(即求在N個(gè)點(diǎn)處次數(shù)小于N的多項(xiàng)式的值)都需要耗費(fèi)2次時(shí)間,例如對(duì)于1000個(gè)點(diǎn)求拉格朗日插值,需要幾百萬個(gè)步驟,而且100萬個(gè)點(diǎn)的拉格朗日插值需要萬億個(gè)步驟。這是不可接受的低效率,所以我們需要使用更加有效的算法,快速傅立葉變換。
FFT只需要花費(fèi)O(n * log(n))的時(shí)間(也就是說,1000個(gè)點(diǎn)的計(jì)算需要10,000步,100萬個(gè)點(diǎn)的計(jì)算需要2000步),雖然它的范圍更受限制;x坐標(biāo)必須是單位根部的完全集合,必須滿足N = 2k 階。也就是說,如果有N個(gè)點(diǎn),那么x坐標(biāo)必須某個(gè)P值的連續(xù)冪,1, p, p2, p3…,其中pN = 1。這個(gè)算法能夠用來進(jìn)行多點(diǎn)計(jì)算和插值計(jì)算,而且只需要調(diào)整一個(gè)小參數(shù)。
下面就是算法詳情(這是個(gè)簡(jiǎn)單的表達(dá)方式;更詳細(xì)內(nèi)容可以參閱此處代碼)
def fft(vals, modulus, root_of_unity): if len(vals) == 1: return vals L = fft(vals[::2], modulus, pow(root_of_unity, 2, modulus)) R = fft(vals[1::2], modulus, pow(root_of_unity, 2, modulus)) o = [0 for i in vals] for i, (x, y) in enumerate(zip(L, R)): y_times_root = y*pow(root_of_unity, i, modulus) o[i] = (x+y_times_root) % modulus o[i+len(L)] = (x-y_times_root) % modulus return o def inv_fft(vals, modulus, root_of_unity): f = PrimeField(modulus) # Inverse FFT invlen = f.inv(len(vals)) return [(x*invlen) % modulus for x in fft(vals, modulus, f.inv(root_of_unity))]
你可以自己通過一些輸入來運(yùn)行代碼,并且看看是否能得到想要的結(jié)果,當(dāng)你使用eval_poly_at的時(shí)候,給出你期望得到的答案。例如:
fft.fft([3,1,4,1,5,9,2,6], 337, 85, inv=True) [46, 169, 29, 149, 126, 262, 140, 93] f = poly_utils.PrimeField(337) [f.eval_poly_at([46, 169, 29, 149, 126, 262, 140, 93], f.exp(85, i)) for i in range(8)] [3, 1, 4, 1, 5, 9, 2, 6]
傅里葉變換會(huì)把[x[0] …. x[n-1]]作為輸入,并且它的目標(biāo)是輸出x[0] + x[1] + … + x[n-1]作為首個(gè)元素,x[0] + x[1] * 2 + … + x[n-1] * w**(n-1)作為第二個(gè)元素,等等;快速傅里葉變換可以通過把數(shù)據(jù)分為兩半,來完成這個(gè),在兩邊都進(jìn)行FFT,然后將結(jié)果結(jié)合在一起。
上圖就是信息如何進(jìn)行FFT運(yùn)算的解釋。請(qǐng)注意FFT是如何進(jìn)行兩次數(shù)據(jù)復(fù)制,并且進(jìn)行粘合,直到你得到一個(gè)元素。
現(xiàn)在,我們把所有部分組合起來,看看整件事情是如何:def mk_mimc_proof(inp, steps, round_constants),它生成運(yùn)行 MIMC 函數(shù)的執(zhí)行結(jié)果的證明,其中給定的輸入為步驟數(shù)。首先,是一些 assert 函數(shù):
# Calculate the set of x coordinates xs = get_power_cycle(root_of_unity, modulus) column = [] for i in range(len(xs)//4): x_poly = f.lagrange_interp_4( [xs[i+len(xs)*j//4] for j in range(4)], [values[i+len(values)*j//4] for j in range(4)], ) column.append(f.eval_poly_at(x_poly, special_x))
擴(kuò)展因子是我們將要拉伸的計(jì)算軌跡(執(zhí)行 MIMC 函數(shù)的“中間值”的集合)。
m2 = merkelize(column) # Pseudo-randomly select y indices to sample # (m2[1] is the Merkle root of the column) ys = get_pseudorandom_indices(m2[1], len(column), 40) # Compute the Merkle branches for the values in the polynomial and the column branches = [] for y in ys: branches.append([mk_branch(m2, y)] + [mk_branch(m, y + (len(xs) // 4) * j) for j in range(4)])
我們需要步數(shù)乘以擴(kuò)展因子最多為 2^32,因?yàn)楫?dāng) k 32 時(shí),我們沒有 2^k 次的單位根。
computational_trace_polynomial = inv_fft(computational_trace, modulus, subroot) p_evaluations = fft(computational_trace_polynomial, modulus, root_of_unity)
我們首個(gè)計(jì)算會(huì)是得出計(jì)算軌跡;也就是說,所有的計(jì)算中間值,從輸入到輸出。
assert steps = 2**32 // extension_factor assert is_a_power_of_2(steps) and is_a_power_of_2(len(round_constants)) assert len(round_constants) steps
然后,我們會(huì)從將計(jì)算軌跡轉(zhuǎn)換為多項(xiàng)式,在單位根 g (其中,g^steps = 1)的連續(xù)冪的軌跡上“放下”連續(xù)值,然后我們對(duì)更大的集合——即單位根 g2 的連續(xù)冪,其中 g2^steps * 8 = 1(注意 g2^8 = g)的多項(xiàng)式求值。
# Generate the computational trace computational_trace = [inp] for i in range(steps-1): computational_trace.append((computational_trace[-1]**3 + round_constants[i % len(round_constants)]) % modulus) output = computational_trace[-1]
黑色: g1 的冪。紫色: g2 的冪。橙色:1。你可以將連續(xù)的單位根看作一個(gè)按這種方式排列的圓圈。我們沿著 g1的冪“放置”計(jì)算軌跡,然后擴(kuò)展它來計(jì)算在中間值處(即 g2 的冪)的相同多項(xiàng)式的值。
我們可以將MIMC的循環(huán)常數(shù)轉(zhuǎn)換為多項(xiàng)式。因?yàn)檫@些循環(huán)常數(shù)鏈?zhǔn)欠浅Mǔ0l(fā)生地(在我們的測(cè)試中,每64個(gè)步驟都會(huì)進(jìn)行),最終證明他們形成了64階的多項(xiàng)式,而且外面可以很容易計(jì)算出它的表達(dá)式,以及擴(kuò)展式:
skips2 = steps // len(round_constants) constants_mini_polynomial = fft(round_constants, modulus, f.exp(subroot, skips2), inv=True) constants_polynomial = [0 if i % skips2 else constants_mini_polynomial[i//skips2] for i in range(steps)] constants_mini_extension = fft(constants_mini_polynomial, modulus, f.exp(root_of_unity, skips2))
假設(shè)其中有8192個(gè)步驟,并且有64個(gè)循環(huán)常數(shù)。這是我們想要做的:我們正在進(jìn)行FFT,從而計(jì)算循環(huán)常數(shù)來作為g1128 的功能。然后我們?cè)谥g加入很多零,來完成g1本身的功能。因?yàn)間1128 大約每64步進(jìn)行循環(huán),我們知道g1這個(gè)功能也會(huì)同樣。我們只計(jì)算這個(gè)擴(kuò)展中的512個(gè)步驟,因?yàn)槲覀冎肋@個(gè)擴(kuò)展會(huì)在每512步之后重復(fù)。現(xiàn)在,我們按照斐波那契案例中那樣,計(jì)算C(P(x)),除了這次是計(jì)算,需要注意,我們不在計(jì)算使用系數(shù)形式的多項(xiàng)式;而是根據(jù)高次單位根的連續(xù)冪來對(duì)多項(xiàng)式進(jìn)行求值。
c_of_p需要滿足Q(x) = C(P(x), P(g1*x),K(x)) = P(g1*x) – P(x)**3 – K(x);目標(biāo)是對(duì)于任何我們放入計(jì)算軌道的x(除了最后一步,因?yàn)樵谧詈笠徊街螅蜎]有步驟),計(jì)算軌跡中的下個(gè)數(shù)值就和之前的相等,再加上循環(huán)常量。與第1部分中的斐波那契示例不同,其中如果某個(gè)計(jì)算步驟是在k向量,下個(gè)就會(huì)是k+1向量,我們把低次單位根( g1 )的連續(xù)冪放下計(jì)算軌跡,所以如果某個(gè)計(jì)算步驟是在x = g1i ,下個(gè)步驟就會(huì)在g1i+1 = g1i * g1 = x * g1。因此,對(duì)于低階單位根( g1 )的每一個(gè)冪,我們希望最終會(huì)是P(x*g1) = P(x)**3 + K(x),或者P(x*g1) – P(x)**3 – K(x) = Q(x) = 0。因此,Q(x) 會(huì)在低次單位根 g 的所有連續(xù)冪上等于零(除了最后一個(gè))。
# Create the composed polynomial such that # C(P(x), P(g1*x), K(x)) = P(g1*x) - P(x)**3 - K(x) c_of_p_evaluations = [(p_evaluations[(i+extension_factor)%precision] - f.exp(p_evaluations[i], 3) - constants_mini_extension[i % len(constants_mini_extension)]) % modulus for i in range(precision)] print('Computed C(P, K) polynomial')
有個(gè)代數(shù)定理證明,如果Q(x)在所有這些x坐標(biāo),都等于零,那么最小多項(xiàng)式的乘積就會(huì)在所有這些x坐標(biāo)等于零:Z(x) = (x – x_1) * (x – x_2) * … * (x – x_n)。通過證明在任何單個(gè)的坐標(biāo),Q(x)是等于零,我們想要證明這個(gè)很難,因?yàn)轵?yàn)證這樣的證明比運(yùn)行原始計(jì)算需要耗費(fèi)更長(zhǎng)的時(shí)間,我們會(huì)使用一個(gè)間接的方式來證明Q(x)是Z(x)的乘積。并且我們會(huì)怎么做呢?通過證明D(x) = Q(x) / Z(x),并且使用FRI來證明它其實(shí)是個(gè)多項(xiàng)式,而不是個(gè)分?jǐn)?shù)。
我們選擇低次單位根和高次單位根的特定排列,因?yàn)槭聦?shí)證明,計(jì)算Z(x),而且除以Z(x)也十分簡(jiǎn)單:Z 的表達(dá)式是兩項(xiàng)的一部分。
需要注意地是,直接計(jì)算Z的分子和分母,然后使用批量模逆的方法將除以Z轉(zhuǎn)換為乘法,隨后通過 Z(X) 的逆來逐點(diǎn)乘以 Q(x) 的值。需要注意,對(duì)于低次單位根的冪,除了最后一個(gè),都可以得到Z(x) = 0,所以這個(gè)計(jì)算包含其逆計(jì)算就會(huì)中斷。這是非常不幸的,雖然我們會(huì)通過簡(jiǎn)單地修改隨機(jī)檢查和FRI算法來堵住這個(gè)漏洞,所以就算我們計(jì)算錯(cuò)誤,也沒關(guān)系。
因?yàn)閆(x)可以簡(jiǎn)潔地表達(dá),我們也可以獲得另個(gè)好處:驗(yàn)證者對(duì)于任何特別的x,可以快速計(jì)算Z(x),而且還不需要任何提前計(jì)算。對(duì)于證明者來說,我們可以接受證明者必須處理大小等于步數(shù)的多項(xiàng)式,但我們不想讓驗(yàn)證者做同樣的事情,因?yàn)槲覀兿M?yàn)證過程足夠簡(jiǎn)潔。
# Compute D(x) = Q(x) / Z(x) # Z(x) = (x^steps - 1) / (x - x_atlast_step) z_num_evaluations = [xs[(i * steps) % precision] - 1 for i in range(precision)] z_num_inv = f.multi_inv(z_num_evaluations) z_den_evaluations = [xs[i] - last_step_position for i in range(precision)] d_evaluations = [cp * zd * zni % modulus for cp, zd, zni in zip(c_of_p_evaluations, z_den_evaluations, z_num_inv)] print('Computed D polynomial')
在幾個(gè)隨機(jī)點(diǎn)上,進(jìn)行概念檢測(cè)D(x) * Z(x) = Q(x),從而可以驗(yàn)證轉(zhuǎn)賬約束,每個(gè)計(jì)算步驟是之前步驟的有效結(jié)果。但是我們也想驗(yàn)證邊界約束,其中計(jì)算的輸入和輸出就是證明者所說的那樣。只是要求證明者提供P(1), D(1), P(last_step)還有D(last_step)的數(shù)值,這些都是很脆弱的;沒有證明,那些數(shù)值都是在同個(gè)多項(xiàng)式。所以,我們使用類似的多項(xiàng)式除法技巧:
# Compute interpolant of ((1, input), (x_atlast_step, output)) interpolant = f.lagrange_interp_2([1, last_step_position], [inp, output]) i_evaluations = [f.eval_poly_at(interpolant, x) for x in xs] zeropoly2 = f.mul_polys([-1, 1], [-last_step_position, 1]) inv_z2_evaluations = f.multi_inv([f.eval_poly_at(quotient, x) for x in xs]) # B = (P - I) / Z2 b_evaluations = [((p - i) * invq) % modulus for p, i, invq in zip(p_evaluations, i_evaluations, inv_z2_evaluations)] print('Computed B polynomial')
那么,我們的論證如下。證明者想要證明P(1) == input和P(last_step) == output。如果我們將I(x)作為插值,那么就是穿越(1, input)和(last_step, output)亮點(diǎn)的線,于是P(x) – I(x)就會(huì)在這亮點(diǎn)上等于零。因此,它會(huì)證明P(x) – I(x)是P(x) – I(x)的乘積,并且我們通過提高商數(shù)來證明這點(diǎn)。
紫色:計(jì)算軌跡多項(xiàng)式 (P) 。綠色:插值 (I)(注意插值是如何構(gòu)造的,其在 x = 1 處等于輸入(應(yīng)該是計(jì)算軌跡的第一步),在 x=g^(steps-1) 處等于輸出(應(yīng)該是計(jì)算軌跡的最后一步)。紅色:P-I。黃色:在x = 1和 x=g^(steps-1)(即 Z2)處等于 0 的最小多項(xiàng)式。粉紅色:(P – I) / Z2。
現(xiàn)在,我們來看看將P,D和B的默克爾根部組合在一起。
現(xiàn)在,我們需要證明P,D和B其實(shí)都是多項(xiàng)式,并且是最大的正確階數(shù)。但是FRI證明是很大且昂貴的,而且我們不想有三個(gè)FRI證明,所以,我們計(jì)算 P,D 和 B 的偽隨機(jī)線性組合,并且基于它來進(jìn)行FRI證明:
# Compute their Merkle roots mtree = merkelize([pval.to_bytes(32, 'big') + dval.to_bytes(32, 'big') + bval.to_bytes(32, 'big') for pval, dval, bval in zip(p_evaluations, d_evaluations, b_evaluations)]) print('Computed hash root')
除非所有這三個(gè)多項(xiàng)式有正確的低階,不然幾乎不可能有隨機(jī)選擇的線性組合,所以這很足夠。
我們想要證明D的階數(shù)小于2 * steps,而且P 和 B 的次數(shù)小于steps,所以我們其實(shí)使用了隨機(jī)的P, P * xsteps, B, Bsteps 和 D的隨機(jī)組合,并且可以看出這部分組合是小于2 * steps。
現(xiàn)在,我們來檢查下所有的多項(xiàng)式組合。我們先獲得很多隨機(jī)的索引,然后在這些索引上為默克爾樹枝提供多項(xiàng)式:
k1 = int.from_bytes(blake(mtree[1] + b'\x01'), 'big') k2 = int.from_bytes(blake(mtree[1] + b'\x02'), 'big') k3 = int.from_bytes(blake(mtree[1] + b'\x03'), 'big') k4 = int.from_bytes(blake(mtree[1] + b'\x04'), 'big') # Compute the linear combination. We don't even bother calculating it # in coefficient form; we just compute the evaluations root_of_unity_to_the_steps = f.exp(root_of_unity, steps) powers = [1] for i in range(1, precision): powers.append(powers[-1] * root_of_unity_to_the_steps % modulus) l_evaluations = [(d_evaluations[i] + p_evaluations[i] * k1 + p_evaluations[i] * k2 * powers[i] + b_evaluations[i] * k3 + b_evaluations[i] * powers[i] * k4) % modulus for i in range(precision)]
get_pseudorandom_indices函數(shù)會(huì)回復(fù)[0…precision-1]范圍中的隨機(jī)索引,而且exclude_multiples_of參數(shù)并不會(huì)給出特定參數(shù)倍數(shù)的值。這就保證了,我們不會(huì)沿著原始計(jì)算軌跡進(jìn)行采樣,否則就會(huì)獲得錯(cuò)誤的答案。
證明是由一組默克爾根、經(jīng)過抽查的分支以及隨機(jī)線性組合的低次證明組成:
# Do some spot checks of the Merkle tree at pseudo-random coordinates, excluding # multiples of `extension_factor` branches = [] samples = spot_check_security_factor positions = get_pseudorandom_indices(l_mtree[1], precision, samples, exclude_multiples_of=extension_factor) for pos in positions: branches.append(mk_branch(mtree, pos)) branches.append(mk_branch(mtree, (pos + skips) % precision)) branches.append(mk_branch(l_mtree, pos)) print('Computed %d spot checks' % samples)
整個(gè)證明最長(zhǎng)的部分是默克爾樹分支,還有FRI證明,這是有更多分支來組成的。這是驗(yàn)證者的實(shí)質(zhì)結(jié)果:
o = [mtree[1], l_mtree[1], branches, prove_low_degree(l_evaluations, root_of_unity, steps * 2, modulus, exclude_multiples_of=extension_factor)]
在每個(gè)位置,證明者需要提供一個(gè)默克爾證明,從而讓驗(yàn)證者能夠檢查這個(gè)默克爾證明,并且檢查C(P(x), P(g1*x), K(x)) = Z(x) * D(x)以及B(x) * Z2(x) + I(x) = P(x)(提醒:對(duì)于不在初始計(jì)算軌道上的x,Z(x)不會(huì)是零,所以C(P(x), P(g1*x), K(x)也不會(huì)是零)。驗(yàn)證者也會(huì)檢查線性組合是正確的,然后調(diào)用。
for i, pos in enumerate(positions): x = f.exp(G2, pos) x_to_the_steps = f.exp(x, steps) mbranch1 = verify_branch(m_root, pos, branches[i*3]) mbranch2 = verify_branch(m_root, (pos+skips)%precision, branches[i*3+1]) l_of_x = verify_branch(l_root, pos, branches[i*3 + 2], output_as_int=True) p_of_x = int.from_bytes(mbranch1[:32], 'big') p_of_g1x = int.from_bytes(mbranch2[:32], 'big') d_of_x = int.from_bytes(mbranch1[32:64], 'big') b_of_x = int.from_bytes(mbranch1[64:], 'big') zvalue = f.div(f.exp(x, steps) - 1, x - last_step_position) k_of_x = f.eval_poly_at(constants_mini_polynomial, f.exp(x, skips2)) # Check transition constraints Q(x) = Z(x) * D(x) assert (p_of_g1x - p_of_x ** 3 - k_of_x - zvalue * d_of_x) % modulus == 0 # Check boundary constraints B(x) * Z2(x) + I(x) = P(x) interpolant = f.lagrange_interp_2([1, last_step_position], [inp, output]) zeropoly2 = f.mul_polys([-1, 1], [-last_step_position, 1]) assert (p_of_x - b_of_x * f.eval_poly_at(zeropoly2, x) - f.eval_poly_at(interpolant, x)) % modulus == 0 # Check correctness of the linear combination assert (l_of_x - d_of_x - k1 * p_of_x - k2 * p_of_x * x_to_the_steps - k3 * b_of_x - k4 * b_of_x * x_to_the_steps) % modulus == 0
其實(shí)還沒有完成成功;證明對(duì)跨多項(xiàng)式檢查和 FRI 所需的抽查次數(shù)的可靠性分析是非常棘手的。但是這些就是所有代碼,至少你不用擔(dān)心進(jìn)行瘋狂的優(yōu)化。當(dāng)我運(yùn)行以上代碼的時(shí)候,我們會(huì)獲得STARK證明,會(huì)有300-400倍的證明成本例如,一個(gè)需要 0.2 秒的 MIMC 計(jì)算需要 60 秒來證明)。這就使得4核機(jī)器計(jì)算MIMC中的 STARK,實(shí)際上可以比后向計(jì)算 MIMC 更快。也就是說,在python語言,這會(huì)相對(duì)低效的實(shí)現(xiàn),并且這也會(huì)證明運(yùn)行時(shí)間比例會(huì)不同。同時(shí),也值得指出,MIMC 的 STARK 證明成本非常低,因?yàn)镸IMC幾乎是完美地可計(jì)算,它的數(shù)學(xué)形式很簡(jiǎn)單。對(duì)于平均計(jì)算,會(huì)包含更少的清晰計(jì)算(例如,檢查一個(gè)數(shù)是大于還是小于另一個(gè)),其計(jì)算成本可能會(huì)更高,會(huì)有大約10000-50000倍。
網(wǎng)頁(yè)標(biāo)題:python開環(huán)傳遞函數(shù) 開環(huán)傳遞函數(shù)怎么求閉環(huán)傳遞函數(shù)
轉(zhuǎn)載注明:http://jinyejixie.com/article40/dosdceo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站導(dǎo)航、企業(yè)建站、響應(yīng)式網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)