如何在MATLAB或Python中求解大型非线性方程组? 问题描述
我试图解非线性方程组:如何在MATLAB或Python中求解大型非线性方程组? 问题描述,python,matlab,nonlinear-optimization,Python,Matlab,Nonlinear Optimization,我试图解非线性方程组: 我有60个方程(3个方程的变化和中替换的测量数据)和10个复数未知量(分解为20个幅值/相位未知量) 震级以dB为单位指定,应为介于-80和0之间的实际值,标记为s11db、s21db、s22db、s31db、s32db、s33db、s41db、s42db、s43db、s44db 相位以弧度表示,应为介于0和2*pi之间的实值,标记为s11ph、s21ph、s22ph、s31ph、s32ph、s33ph、s41ph、s42ph、s43ph、s44ph 4个附加约束方程强
- 我有60个方程(3个方程的变化和中替换的测量数据)和10个复数未知量(分解为20个幅值/相位未知量)
- 震级以dB为单位指定,应为介于-80和0之间的实际值,标记为s11db、s21db、s22db、s31db、s32db、s33db、s41db、s42db、s43db、s44db
- 相位以弧度表示,应为介于0和2*pi之间的实值,标记为s11ph、s21ph、s22ph、s31ph、s32ph、s33ph、s41ph、s42ph、s43ph、s44ph
- 4个附加约束方程强制执行被动性
| s11 | ^2+| s21 | ^2+| s31 | ^2+| s41 | ^2=')) #方程。附加(Rel(s21ph,0,'>=')) #方程.附加(Rel(s22ph,0,'>=')) #附加(Rel(s31ph,0,'>=')) #附加(Rel(s32ph,0,'>=')) #附加(Rel(s33ph,0,'>=')) #方程.附加(Rel(s41ph,0,'>=')) #方程.附加(Rel(s42ph,0,'>=')) #方程.附加(Rel(s43ph,0,'>=')) #方程.附加(Rel(s44ph,0,'>=')) #方程.附加(Rel(s11ph,2*sympy.pi,'
%% fbnd.m function F = fbnd(x) mr1=[0.016748068572860958+0.02165573563670993j 0.3524499197684044+1.01318272809286j 0.9902384965572285-0.4090088119125726j 0.9902384965572285-0.4090088119125726j 0.8639480592070746-0.6312186830903206j 0.8481899405540196-0.6521365553445038j 0.8639480592070746-0.6312186830903206j 0.8483474812536963-0.6520564750063542j 0.8599389505285947-0.6367147924208255j 0.844854651665744-0.6565142490941961j 0.8599389505285947-0.6367147924208255j 0.8596032944139899-0.6370905579072205j 0.12178304066817838+0.23419002409258938j 0.25810610017732+0.11233917791430391j -0.7881852138612478+0.2941231164148775j 0.8537371705084078+0.46722896692551863j 0.14050135652671147+0.3073232683089746j 0.09456025715651947+0.3638487655929115j 0.7994228601750994+0.36132988231302926j -0.5729577316366177+0.3829110562916974j]; mr2=[0.01886638946281557+0.02291153736938316j 0.41115632130362006+0.9904544135078267j -1.0602110266293787+0.12873002023570793j -1.0602110266293787+0.12873002023570793j 0.12178304066817838+0.23419002409258938j 0.25810610017732+0.11233917791430391j -0.7881852138612478+0.2941231164148775j 0.8537371705084078+0.46722896692551863j 0.14050135652671147+0.3073232683089746j 0.09456025715651947+0.3638487655929115j 0.7994228601750994+0.36132988231302926j -0.5729577316366177+0.3829110562916974j 0.8639480592070746-0.6312186830903206j 0.8481899405540196-0.6521365553445038j 0.8639480592070746-0.6312186830903206j 0.8483474812536963-0.6520564750063542j 0.8599389505285947-0.6367147924208255j 0.844854651665744-0.6565142490941961j 0.8599389505285947-0.6367147924208255j 0.8596032944139899-0.6370905579072205j]; ms11p=[-0.06420852176004949+0.007606136138496574j -0.537896794882235+0.4041100722456898j 0.1412012055714567+0.5635279161255173j 0.1937727600367866+0.4292234886620929j 0.1469515332766462+0.5314862612846253j 0.1518709241016716+0.5310052159365275j 0.1578520689668907+0.5331598663019053j 0.1540581804228726+0.5392467784421259j 0.1431331385368337+0.5325073157781589j 0.1535928910517443+0.5342246999907136j 0.1512448255547076+0.5392322097605335j 0.1473241418663376+0.5318193110512432j -0.2363809027693515+0.1174058767406709j -0.163391416393593+0.08774117501580507j -0.4568108580888767-0.2143100180166485j 0.193345944206058-0.04761628164099008j -0.237571999125396+0.1195031741294373j -0.2034191332391219+0.1681349627984851j 0.03011118465025885-0.09412680418431373j -0.04464063283385059+0.3528230797332958j]; ms21p=[-0.003180197204485371-0.002823666341755482j -0.1906367035405745+0.0686968862920421j -0.05526246736964503+0.02635489796438511j 0.002518013584325512+0.06590835456839306j -0.03537661863079149+0.08706407624479129j -0.01805052294769753+0.08243849033759301j -0.07056927627440178+0.03869620150023408j 0.02738173375006136+0.04029812368020189j -0.02971165660146774+0.08491907637374546j -0.02737424760484992+0.09187392180460466j 0.001038602543646932+0.03696165082008047j 0.01181224381379054+0.1271817903117702j -0.03214857971468995+0.1284805218320462j -0.01717410586879602+0.1297380448848506j -0.03433798336733016+0.06369364773628092j 0.043654417400282+0.1396753864320528j -0.03468050284302436+0.1289630391584528j -0.03705274246077175+0.1366485542793229j 0.02030699854620357+0.1217902270543576j -0.0236005339029794+0.1770862461678967j]; ms22p=[-0.1624942212974896-0.004693967380702952j -0.284542316854743-0.7064738951728178j 0.4536543123936424-0.4578177740567013j -0.1024338501849106-0.1979272945233151j -0.1097995580875526-0.198389196010508j -0.07902213390718082-0.08677717201029744j 0.3602007967821697-0.4162898752449462j 0.1822099768155973+0.3712680606767835j -0.09809454238916153-0.1552338582896147j -0.1688279742308047-0.115960920204985j 0.2331637616249181+0.1528931729845114j -0.4800053258074745+0.09873053685139994j -0.7738872200476685-0.04023055998635539j -0.7721863083906342-0.02871292187380659j -0.7821436668003945-0.03478684929877463j -0.7693920578775125-0.04497757228074708j -0.7737959107116188-0.03930039783428967j -0.7721735572720234-0.03995110444341842j -0.7729703027226912-0.04204217380573128j -0.766856877704361-0.04045169338481738j]; F = zeros(60); for n=1:length(ms22p) r1 = mr1(n); r2 = mr2(n); s11p = ms11p(n); s21p = ms21p(n); s22p = ms22p(n); s11db = x(1); s21db = x(2); s22db = x(3); s31db = x(4); s32db = x(5); s33db = x(6); s41db = x(7); s42db = x(8); s43db = x(9); s44db = x(10); s11ph = x(11); s21ph = x(12); s22ph = x(13); s31ph = x(14); s32ph = x(15); s33ph = x(16); s41ph = x(17); s42ph = x(18); s43ph = x(19); s44ph = x(20); s = @(db,ph) 10.^(db/10) * exp(1j*ph); index = 3*(n-1)+1; F(index) = ((s(s11db,s11ph) * (1 - (s(s43db,s43ph) * r2 * s(s43db,s43ph) * r1 + s(s33db,s33ph) * r1 + s(s44db,s44ph) * r2) ... + (s(s33db,s33ph) * r1 * s(s44db,s44ph) * r2)) + s(s31db,s31ph) * r1 * s(s31db,s31ph) * (1-(s(s44db,s44ph) * r2)) ... + s(s31db,s31ph) * r1 * s(s43db,s43ph) * r2 * s(s41db,s41ph) + s(s41db,s41ph) * r2 * s(s41db,s41ph) * (1-( s(s33db,s33ph) * r1)) ... + s(s41db,s41ph) * r2 * s(s43db,s43ph) * r1 * s(s31db,s31ph)) / (1 - (s(s43db,s43ph) * r2 * s(s43db,s43ph) * r1 ... + s(s33db,s33ph) * r1 + s(s44db,s44ph) * r2) + (s(s33db,s33ph) * r1 * s(s44db,s44ph) * r2))) - s11p; index = 3*(n-1)+2; F(index) = ((s(s32db,s32ph)*r1*s(s31db,s31ph)*(1-(s(s44db,s44ph)*r2)+0)+s(s32db,s32ph)*r1*s(s43db,s43ph)*r2*s(s41db,s41ph)+s(s42db,s42ph)*r2 ... *s(s41db,s41ph)*(1-(s(s33db,s33ph)*r1))+s(s42db,s42ph)*r2*s(s43db,s43ph)*r1*s(s31db,s31ph)+s(s21db,s21ph)*(1 ... -(s(s43db,s43ph)*r2*s(s43db,s43ph)*r1+s(s33db,s33ph)*r1+s(s44db,s44ph)*r2)+(s(s33db,s33ph)*r1*s(s44db,s44ph)*r2))) / (1 ... -(s(s43db,s43ph)*r2*s(s43db,s43ph)*r1+s(s33db,s33ph)*r1+s(s44db,s44ph)*r2)+(s(s33db,s33ph)*r1*s(s44db,s44ph)*r2))) - s21p; index = 3*(n-1)+3; F(index) = ((s(s32db,s32ph)*r1*s(s32db,s32ph)*(1-(s(s44db,s44ph)*r2)+0)+s(s32db,s32ph)*r1*s(s43db,s43ph)*r2*s(s42db,s42ph)*(1-0+0)+s(s22db,s22ph)*(1 ... -(s(s43db,s43ph)*r2*s(s43db,s43ph)*r1+s(s33db,s33ph)*r1+s(s44db,s44ph)*r2)+(s(s33db,s33ph)*r1*s(s44db,s44ph)*r2))+s(s42db,s42ph)*r2* ... s(s42db,s42ph)*(1-(s(s33db,s33ph)*r1)+0)+s(s42db,s42ph)*r2*s(s43db,s43ph)*r1*s(s32db,s32ph)*(1-0+0)) / (1 ... -(s(s43db,s43ph)*r2*s(s43db,s43ph)*r1+s(s33db,s33ph)*r1+s(s44db,s44ph)*r2)+(s(s33db,s33ph)*r1*s(s44db,s44ph)*r2))) - s22p; end end %% solve.m lb = -80* [1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0]; ub = 2*pi* [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1]; guesses = [-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,0,0,0,0,0,0,0,0,0,0]; options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective',... 'MaxIterations',5000,... 'Display','Iter-detailed'... ); %$[x,res] = lsqnonlin(@fbnd,guesses,lb,ub,options); optionsf = optimoptions(@fsolve,'Algorithm','trust-region',... 'Diagnostics','on') [x,res] = fsolve(@fbnd,guesses)