%23%20gallery_category%3A%20Allpass%20FDN%20Examples%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.23.13%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Allpass%20but%20not%20uniallpass%20FDN%0A%0A%20%20%20%20Example%20of%20an%20FDN%20that%20is%20**allpass%20only%20for%20specific%20delay%20lengths**%2C%20not%20for%20arbitrary%20delays.%20So%20it%20is%20not%20*uniallpass*%20(allpass%20for%20any%20choice%20of%20delays).%0A%0A%20%20%20%20We%20build%20a%20SISO%20system%20by%20taking%20a%20random%20orthogonal%20system%20matrix%20and%20applying%20a%20**non-diagonal%20similarity%20transform**%20(on%20the%20first%20two%20delays).%20The%20resulting%20FDN%20is%20allpass%20(and%20stable)%20for%20some%20delay%20vectors%20and%20not%20for%20others.%0A%0A%20%20%20%20See%20*Allpass%20Feedback%20Delay%20Networks*%2C%20Sebastian%20J.%20Schlecht%20(IEEE%20Trans.%20Signal%20Processing).%0A%0A%20%20%20%20%E2%80%94%20Original%20MATLAB%3A%20Sebastian%20J.%20Schlecht%2C%2022%20Dec%202020%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Setup%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20scipy.linalg%20import%20orth%0A%0A%20%20%20%20import%20pyFDN%0A%0A%20%20%20%20return%20np%2C%20orth%2C%20pyFDN%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Build%20system%20matrix%20(orthogonal%20%2B%20non-diagonal%20similarity)%0A%0A%20%20%20%20Start%20from%20a%20random%20orthogonal%20(N%2B1)%C3%97(N%2B1)%20system%20matrix%20**V**%2C%20then%20apply%20**X%E2%81%BB%C2%B9%20V%20X**%20with%20**X**%20non-diagonal%20so%20the%20result%20is%20no%20longer%20uniallpass.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20orth)%3A%0A%20%20%20%20np.random.seed(1)%0A%20%20%20%20N%20%3D%203%0A%0A%20%20%20%20V%20%3D%20orth(np.random.randn(N%20%2B%201%2C%20N%20%2B%201))%0A%0A%20%20%20%20X%20%3D%20np.eye(N%20%2B%201)%0A%20%20%20%20X%5B0%2C%200%5D%20%3D%20-0.1%0A%20%20%20%20X%5B1%2C%200%5D%20%3D%200.5%0A%0A%20%20%20%20%23%20V%20%3D%20np.linalg.solve(X%2C%20V%20%40%20X)%0A%20%20%20%20V%20%3D%20np.linalg.inv(X)%20%40%20V%20%40%20X%0A%0A%20%20%20%20A%20%3D%20V%5B%3A-1%2C%20%3A-1%5D%0A%20%20%20%20b%20%3D%20V%5B%3A-1%2C%20-1%3A%5D%0A%20%20%20%20c%20%3D%20V%5B-1%3A%2C%20%3A-1%5D%0A%20%20%20%20d%20%3D%20V%5B-1%3A%2C%20-1%3A%5D%0A%0A%20%20%20%20print(%22A%20%3D%22%2C%20A)%0A%20%20%20%20print(%22b%20%3D%22%2C%20b.T)%0A%20%20%20%20print(%22c%20%3D%22%2C%20c)%0A%20%20%20%20print(%22d%20%3D%22%2C%20d)%0A%20%20%20%20return%20A%2C%20b%2C%20c%2C%20d%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Test%3A%20allpass%20and%20stable%20for%20m%20%3D%20%5B1%2C%201%2C%201%5D%0A%0A%20%20%20%20For%20this%20delay%20vector%20the%20system%20is%20allpass%20and%20the%20denominator%20roots%20lie%20inside%20the%20unit%20circle%20(stable).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A%2C%20b%2C%20c%2C%20d%2C%20np%2C%20pyFDN)%3A%0A%20%20%20%20_m%20%3D%20np.array(%5B1%2C%201%2C%201%5D)%0A%20%20%20%20_is_a%2C%20_den%2C%20_num%20%3D%20pyFDN.is_allpass(A%2C%20b%2C%20c%2C%20d%2C%20_m)%0A%0A%20%20%20%20_roots_den%20%3D%20np.roots(_den)%0A%20%20%20%20_stable%20%3D%20np.all(np.abs(_roots_den)%20%3C%201)%0A%20%20%20%20assert%20_stable%2C%20%22Expected%20stable%20(%7Croots%7C%20%3C%201)%22%0A%20%20%20%20assert%20_is_a%2C%20%22Expected%20allpass%20for%20m%20%3D%20%5B1%2C1%2C1%5D%22%0A%20%20%20%20print(%22Allpass%3A%20OK%2C%20stable%3A%20OK%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Test%3A%20not%20allpass%20and%20unstable%20for%20m%20%3D%20%5B2%2C%201%2C%201%5D%0A%0A%20%20%20%20For%20this%20delay%20vector%20the%20system%20is%20**not**%20allpass%20and%20has%20at%20least%20one%20pole%20outside%20the%20unit%20circle%20(unstable).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A%2C%20b%2C%20c%2C%20d%2C%20np%2C%20pyFDN)%3A%0A%20%20%20%20_m%20%3D%20np.array(%5B2%2C%201%2C%201%5D)%0A%20%20%20%20_is_a%2C%20_den%2C%20_num%20%3D%20pyFDN.is_allpass(A%2C%20b%2C%20c%2C%20d%2C%20_m)%0A%0A%20%20%20%20_roots_den%20%3D%20np.roots(_den)%0A%20%20%20%20unstable%20%3D%20np.any(np.abs(_roots_den)%20%3E%201)%0A%20%20%20%20assert%20unstable%2C%20%22Expected%20unstable%20for%20m%20%3D%20%5B2%2C1%2C1%5D%22%0A%20%20%20%20assert%20not%20_is_a%2C%20%22Expected%20not%20allpass%20for%20m%20%3D%20%5B2%2C1%2C1%5D%22%0A%20%20%20%20print(%22Not%20allpass%3A%20OK%2C%20unstable%3A%20OK%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Test%3A%20allpass%20and%20stable%20for%20m%20%3D%20%5B2%2C%202%2C%201%5D%0A%0A%20%20%20%20For%20this%20delay%20vector%20the%20system%20is%20again%20allpass%20and%20stable.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A%2C%20b%2C%20c%2C%20d%2C%20np%2C%20pyFDN)%3A%0A%20%20%20%20_m%20%3D%20np.array(%5B2%2C%202%2C%201%5D)%0A%20%20%20%20_is_a%2C%20_den%2C%20_num%20%3D%20pyFDN.is_allpass(A%2C%20b%2C%20c%2C%20d%2C%20_m)%0A%0A%20%20%20%20_roots_den%20%3D%20np.roots(_den)%0A%20%20%20%20_stable%20%3D%20np.all(np.abs(_roots_den)%20%3C%201)%0A%20%20%20%20assert%20_stable%2C%20%22Expected%20stable%20(%7Croots%7C%20%3C%201)%22%0A%20%20%20%20assert%20_is_a%2C%20%22Expected%20allpass%20for%20m%20%3D%20%5B2%2C2%2C1%5D%22%0A%20%20%20%20print(%22Allpass%3A%20OK%2C%20stable%3A%20OK%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Test%3A%20not%20uniallpass%0A%0A%20%20%20%20The%20system%20is%20allpass%20only%20for%20specific%20delay%20vectors%20(e.g.%20%5B1%2C1%2C1%5D%20and%20%5B2%2C2%2C1%5D)%2C%20not%20for%20arbitrary%20delays.%20So%20it%20is%20**not%20uniallpass**.%20%60is_uniallpass%60%20checks%20the%20Lyapunov%20matrix%20and%20system%20matrix%20structure%3B%20it%20should%20return%20False%20here.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A%2C%20b%2C%20c%2C%20d%2C%20pyFDN)%3A%0A%20%20%20%20is_uni%2C%20P%20%3D%20pyFDN.is_uniallpass(A%2C%20b%2C%20c%2C%20d)%0A%20%20%20%20assert%20not%20is_uni%2C%20%22Expected%20not%20uniallpass%20(allpass%20only%20for%20specific%20delays)%22%0A%20%20%20%20print(%22Not%20uniallpass%3A%20OK%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
076217f06e35727b96c50d40db8d6288