Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pass through kwargs to norm calculations #542

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open

Conversation

baggepinnen
Copy link
Member

hinfnorm fails to converge quite often and requires argument tuning, this PR allows you to set those arguments

@JuliaControlBot
Copy link

Something failed when generating plots. See the log at https://github.com/JuliaControl/ControlExamplePlots.jl/actions/runs/981759170?check_suite_focus=true for more details.

@olof3
Copy link
Contributor

olof3 commented Jun 29, 2021

That's annoying. But it works if you make the tolerance smaller? Is it for discrete-time or continuous-time systems that you are seeing problems? Perhaps the default settings should be changed or some logic should be added? My feeling is that it should be possible to handle most cases decently without having to manually changing the tolerance.

Regarding this PR, I think it would be better to avoid the issue altogether by getting rid of norm, and just introduce h2norm and l2norm. In analogy with Base, hinfnorm should be opnorm, but the h2norm is not quite an operator norm.

@baggepinnen
Copy link
Member Author

baggepinnen commented Jun 29, 2021

That's annoying. But it works if you make the tolerance smaller? Is it for discrete-time or continuous-time systems that you are seeing problems?

Both, usually high-order systems that arise as the difference between two medium-order systems. Mostly argument approximag needs occasional tuning (increasing in my latest case).

Regarding this PR, I think it would be better to avoid the issue altogether by getting rid of norm, and just introduce h2norm and l2norm. In analogy with Base, hinfnorm should be opnorm, but the h2norm is not quite an operator norm.

Every time there is a tolerance to be set there will e cases where it must be changed, so tuning the defaults is orthogonal to this PR, they still must be settable no matter what we call the function. norm is not the only function I passed kwargs through, it applies to hinfnorm etc. as well

@baggepinnen
Copy link
Member Author

Here's an example that fails

sys = let
    tempA = [-0.015948101119319734 0.0 0.04185849126302005 0.0 0.0 0.0 0.0 0.0 -146.95069642667306 289.4992329744848 -0.6214689449642664 1.0704998483003605 835.1753029801306 -1721.6495755545525 -7702.15700721084 15903.631585610927 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 -0.011069870050970518 0.0 0.03334113387614947 0.0 0.0 0.0 0.0 171.47704409013375 -5185.652046267557 3.3853119792828963 -18.510208955016036 -1295.0940843796357 30687.836682759582 12063.273549901081 -283424.94458045386 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 -0.04185849126302005 0.0 0.0 0.0 0.0 0.0 130.64917644962574 -3950.9729876324254 2.579285317548874 -14.103016346678887 -986.7383500035321 23381.208901150163 9191.065561829399 -215942.81491844106 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 -0.03334113387614947 0.0 0.0 0.0 0.0 -55.106511160002405 108.56221236543183 -0.23305085436159995 0.40143744311263524 313.190738617549 -645.6185908329572 -2888.3088777040653 5963.861844604099 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; -0.5 0.0 0.0 0.0 -0.001 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 -0.5 0.0 0.0 0.0 -0.001 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.5 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -146.96664452779237 289.49923297448487 -0.5796104537012463 1.0704998483003607 835.1753029801307 -1721.6495755545525 -7702.157007210841 15903.631585610929 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 171.47704409013372 -5185.663116137608 3.3853119792828963 -18.476867821139884 -1295.0940843796354 30687.836682759582 12063.273549901081 -283424.9445804538 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 130.64917644962574 -3950.9729876324254 2.5374268262858544 -14.103016346678887 -986.7383500035321 23381.208901150167 9191.065561829399 -215942.8149184411 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -55.106511160002405 108.56221236543182 -0.23305085436159992 0.3680963092364858 313.190738617549 -645.6185908329572 -2888.3088777040653 5963.861844604098 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; -0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.001 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 -0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.001 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.015948101119319734 0.0 0.04185849126302005 0.0 0.0 0.0 0.0 0.0 0.004690578665071557 0.0006398399358145708 0.01118190035871929 -0.015681911812312804 0.010027514385474409 -0.011629389298868609 0.20339473112213025; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.011069870050970518 0.0 0.03334113387614947 0.0 0.0 0.0 0.0 -0.0017662234961502664 0.003157798881021944 0.011480910174226058 0.009124939421717741 0.004397494815906041 -0.00489420105554904 0.005051401793661087; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.04185849126302005 0.0 0.0 0.0 0.0 0.0 -0.0013456940923049652 0.0024059420045881483 0.008747360132743664 0.006952334797499233 0.0033504722406903177 -0.0037289150899421264 0.0038486870808846383; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.03334113387614947 0.0 0.0 0.0 0.0 0.0017589669994018341 0.0002399399759304641 0.0041932126345197345 -0.005880716929617303 0.003760317894552904 -0.0043610209870757295 0.07627302417079886; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.5 0.0 0.0 0.0 -0.001 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.5 0.0 0.0 0.0 -0.001 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.4363666584525321 0.362557845392374 0.0 0.0 0.0 0.0 0.0 0.0 -0.0008848291499142228 0.0001061582446057077 0.000990837874059477 -0.002752340153101867 -0.00023260569512457825 -0.0022088222335968307 0.016692480990276395; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00968032967397838 -0.2163818771142806 0.0 0.0 0.0 0.0 0.0 0.0 0.0005725842954244927 -0.0008117178293962256 0.007084115841708504 0.0006259604877735263 -0.0012564059559961249 0.004360178779816776 -0.0681203395862217; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3070702899708752 -0.6039394816704914 0.0 0.0 0.0 0.0 0.0 0.0 -0.005644601556115492 -0.02319369209218443 -0.031240644104023642 -0.08735969799738057 0.17110673694239079 -0.39261907759479175 6.082378390491541; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5228352872992956 0.3897929030424615 0.0 0.0 0.0 0.0 0.0 0.0 0.03153039161208072 -0.010044403248080081 0.10682019709609707 -0.0427586715326576 0.05113570263190072 0.3204195908239575 -7.969471302442518; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.285695892581991 -9.912198831778479 0.0 0.0 0.0 0.0 0.0 0.0 -0.043762150614295225 -0.029290551640687734 -1.7301671011169644 -0.21712779704417307 -0.09884505570776442 -0.02645583454534342 1.0149889946264474; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 66.11982513396354 26.087254882472426 0.0 0.0 0.0 0.0 0.0 0.0 0.3445587746713475 -0.014446998182097577 11.553271048107813 -7.361194537228241 0.8066820208094543 -0.4147741824323043 3.894560106064139; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1865.03950916407 -61.387026027658464 0.0 0.0 0.0 0.0 0.0 0.0 -7.966357949754776 2.8858392600627543 -246.72396844717483 263.8141390592907 -18.422004802740148 10.486612870143544 -137.75226868441615]
    tempB = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 1.0 0.0; 0.0 1.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 1.0 0.0; 0.0 1.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 1.0 0.0; 0.0 1.0; 0.0 0.0; 0.0 0.0; 0.8727333169050642 -0.725115690784748; -0.01936065934795676 0.4327637542285612; -0.6141405799417504 1.2078789633409828; -1.0456705745985913 -0.779585806084923; 8.571391785163982 19.824397663556958; -132.2396502679271 -52.17450976494485; 3730.07901832814 122.77405205531693]
    tempC = [-0.05 0.0 0.0 0.0 0.0999 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.05 -0.0 -0.0 -0.0 -0.0999 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0; 0.0 -0.05 0.0 0.0 0.0 0.0999 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.0 0.05 -0.0 -0.0 -0.0 -0.0999 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -17.651735306507273 34.774682639577755 -0.074650924320032 0.12858857036640967 100.321357715331 -206.80475382036664 -925.1840248901909 1910.3461364097209 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0005634328726812681 -7.685764994769618e-5 -0.0013431712142605754 0.0018837131306081445 -0.0012045062324894185 0.0013969236395037369 -0.024431799534189818; 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 27.299827914847164 -825.5764451769246 0.5389551409803617 -2.946898938112006 -206.18413283655894 4885.62574053884 1920.521162173307 -45122.37923668917 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 0.0002811898103323808 -0.0005027341502124488 -0.001827806594901661 -0.0014527266741043172 -0.0007000986771591708 0.0007791762874505935 -0.0008042032706326109; 5.0 0.0 0.0 0.0 0.0 0.0 -9.9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.0 -0.0 -0.0 -0.0 -0.0 -0.0 9.9 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0; 0.0 5.0 0.0 0.0 0.0 0.0 0.0 -9.9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.0 -5.0 -0.0 -0.0 -0.0 -0.0 -0.0 9.9 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0 -0.0]
    tempD = [0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0; 0.0 0.0]
    ss(tempA, tempB, tempC, tempD)
end

And here's a test to pass

hinfn = ControlSystems._infnorm_two_steps_ct(sys, :hinf, 1e-9, 1000, 1e-6)[1]
@test hinfn  14.88609988 rtol=1e-3

@olof3
Copy link
Contributor

olof3 commented Jun 29, 2021

norm is not the only function I passed kwargs through, it applies to hinfnorm etc. as well

Ah, right, didn't look too closely. Good that you added the kwargs to the *infnorm functions. I still think that we should remove norm, but I'll open a new issue for discussing that. Also, looking at this again, I guess the kwargs should really be more like imag_tol, unitmag_tol, and maxIters -> max_iters. I guess it would be good to change these, now that these kwargs are passed on directly.

Yes, the tuning parameters are definitely an orthogonal issue. Thanks for this example. I believe that the issue is largely due to that the condition number of sys.A is on the order of 1e9.

FYI, I don't think that max_iters shouldn't have to be changed, the convergence is quadratic (if I remermber correctly), and typically it only takes some tens of iterations for convergence, 17 in your mwe. The max_iter termination is primarily there to guard against infinite loops when there are problems with convergence.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants