草庐IT

【Matlab】设计状态观测器

龙猫略略略 2024-05-10 原文

关于控制理论的学习是长期的,时常就得拿出来复习一下,不然就忘记了,在去年的学习工作中发现了自身理论知识的匮乏,因此在今年会重新拿出来复习一下控制理论,巩固自己的知识储备。

总体步骤:

关于状态观测器的设计,可以按照一下几个基本步骤来设计:

1)引入反馈矩阵G,列出状态观测器的状态方程

2)求出状态方程的特征多项式

3)写出观测器期望极点的特征多项式

4)求解出反馈矩阵G的系数

例子:

例如一个系统的状态方程:

设计状态观测器,使其极点为-10,10

1.引入反馈矩阵G

2.求出特征多项式

3.写出观测器的期望多项式

4.求解G的系数

建模

求出G的系数之后,我们就可以实际搭建一个模型来看看实际的效果

在建模前,我们可以先把系统的状态方程,输出方程,以及观测器的状态方程与输出方程列清楚(观测器的变量取名我都后缀加了 ‘hat’ ):

状态方程:

x1* = x1 + u

x2* = u

输出方程:

y = 2 * x1 - x2

观测器状态方程:

x1*hat = x1_hat + u + g1 * (y - y_hat)

x2*hat = u + g2 * (y - y_hat)

观测器输出方程:

y_hat = 2 * x1_hat - x2_hat

在建模前先写在simulink空白处:

之后先建立原系统部分:

之后开始做观测器的部分:

之后将状态量的实际值与估计值进行对比,可看到观测器是正常工作收敛的:

之后我们可以给状态量一个初值,看看实际观测器能否真的收敛:

有关【Matlab】设计状态观测器的更多相关文章

  1. c# - 触发器返回一个结果集和/或在 SET NOCOUNT OFF 的情况下运行,而另一个未完成的结果集处于事件状态 - 2

    我有2台服务器通过低速wan连接,我们正在运行带有合并复制的SQLServer2008。在订阅者处,有时在尝试插入新行时,我会收到此错误:Atriggerreturnedaresultsetand/orwasrunningwithSETNOCOUNTOFFwhileanotheroutstandingresultsetwasactive.我的数据库没有任何触发器;唯一的触发器是由合并复制创建的触发器此外,无论何时发生此错误,它都会自动回滚现有事务我正在使用DataTables和TableAdapters通过事务插入和更新数据库我检查过的内容:数据库日志文件大小小于50Mb检查了僵尸交易

  2. c# - 当我选择下拉列表时,由于对象的当前状态,操作无效 - 2

    这个问题在这里已经有了答案:'Operationisnotvalidduetothecurrentstateoftheobject'errorduringpostback(4个答案)关闭7年前。我在aspx页面上有radcombo框,当我从中选择任何选项时,它会给出错误`“/”应用程序中的服务器错误。由于对象的当前状态,操作无效。说明:在执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。ExceptionDetails:System.InvalidOperationException:Operationisnotvalid

  3. c# - 如何公开 Application.Properties.Settings 并保持这种状态 - 2

    我正在将我的应用程序设置集中到一个位置,我选择使用我的公共(public)库中的设置集合来完成此操作。我已将所有这些设置移动到它们自己的文件中,该文件使用配置源拉入我的app.config中:<Common.Properties.SettingsconfigSource="config\Common.Properties.Settings.config"/>这让我可以使用VisualStudio的“添加链接”功能,在我的Web和测试应用程序中使用导入的配置文件覆盖默认库设置。现在,我希望能够从我的其他库中访问所有这些很棒的设置值,并且发现我可以通过公开生成的

  4. c# - 如何在 ListView 的组标题中保存 IsExpanded 状态 - 2

    我有一个相当棘手的问题:我正在使用ListView控件,其中ItemsSource设置为CollectionViewSource,包括PropertyGroupDescription以对ListView元素进行分组。CollectionViewSource看起来像这样:<CollectionViewSourcex:Key="ListViewObjects"><CollectionViewSource.Source><BindingPath="CurrentListViewData"/></CollectionVi

  5. c# - 调用Web Services时HTTP状态405 "Method Not Allowed"如何解决 - 2

    我有一个场景,我需要访问具有WSE2.0安全性的SOAPWeb服务。我已经获得了所有生成的c#代理(派生自Microsoft.Web.Services2.WebServicesClientProtocol),我正在应用证书但是当我调用方法时出现错误:System.Net.WebException:TherequestfailedwithHTTPstatus405:MethodNotAllowed.atSystem.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessagemessage,Web

  6. c# - 我想知道在迭代数据读取器对象时连接状态和 'yield' 对代码性能的影响 - 2

    这是我用来从数据库中获取数据的示例代码:在DAO层上:publicIEnumerable<IDataRecord>GetDATA(ICommonSearchCriteriaDtocommonSearchCriteriaDto){using(DbContext){DbDataReaderreader=DbContext.GetReader("ABC_PACKAGE.GET_DATA",oracleParams.ToArray(),CommandType.StoredProcedure);while(reader.Read()){yieldreturnreade

  7. c# - Bot Framework 搞乱了对话框状态 - 2

    我目前正在使用Microsoft的BotFramework制作聊天机器人。在我的流程中,我有一个最后的对话框,让用户知道他们正在参加比赛。还有一种针对未知输入的错误处理方法。这两种方法见此处:[Serializable]publicclassConcertCityDialog:AbstractBasicDialog<DialogResult>{privatestaticFacebookServiceFacebookService=>newFacebookService(newFacebookClient());[LuisIntent("ConcertCity&

  8. c# - CancellationToken.ThrowIfCancellationRequested 后的故障与取消任务状态 - 2

    通常我不会发布带有答案的问题,但这次我想引起一些人对我认为可能是一个晦涩但普遍的问题的关注。它是由thisquestion触发的,从那以后我检查了我自己的旧代码,发现其中一些也受此影响。下面的代码启动并等待两个任务,task1和task2,它们几乎相同。task1与task2的唯一区别在于它运行一个永无止境的循环。IMO,这两种情况对于一些执行CPU密集型工作的现实场景来说都是非常典型的。usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleApplication{publicclas

  9. c# - 加载 View 状态失败。只是偶尔发生。难以重现 - 2

    错误详情如下。此错误仅偶尔/很少/有时发生,并且没有任何重现它的步骤。我怎么知道哪个控件引发了这个Viewstate错误?错误信息:加载View状态失败。加载View状态的控件树必须与上次请求期间用于保存View状态的控件树相匹配。例如,动态添加控件时,回发期间添加的控件必须与初始请求期间添加的控件的类型和位置相匹配。时间:很少/偶尔重建步骤:不能堆栈跟踪:System.Web.HttpUnhandledException:Exceptionoftype'System.Web.HttpUnhandledException'wasthrown.--->System.

  10. c# - 使用 Swagger 的特定状态代码的响应模型 - 2

    我正在使用Swagger记录我的RESTAPI(使用asp.netwebapi2)。有没有办法Swagger为给定api调用的每个可能响应提供响应模型?我正在使用xml注释注释状态代码响应,如下所示:///<summary>///Saveaperson///</summary>///<responsecode="200">Ok</response>///<responsecode="400">BadRequest</response>///<responsecode="

随机推荐

  1. c# - OpenFileDialog/c# 在任何文件上都很慢。更好的解决方案? - 2

    我正在使用C#中的OpenFileDialog打开一个文件,我注意到它需要20-40秒来加载我的文件并清除对话框。这是我的示例代码:privatevoidbtnOpen_Click(objectsender,EventArgse){if(ofdSettings.ShowDialog()==DialogResult.OK){//donothing}}即使是这个有限的示例,对话框也需要20-40秒的时间才能清除。我选择的文件是一个只有1.36kb大的xml文件 最佳答案 我有同样的问题,openFileDialog1.ShowDialo

  2. c# - 如果多个成员具有相同的属性,如何抛出编译器错误 - 2

    简单的问题,如何强制C#编译器抛出编译错误。更新:也许改用Assert.Fail()会更好?我有一个自定义属性,它应该只应用于一个类的一个成员。在我的另一个类的静态方法中,它会查找那个成员,如果不止一个成员应用了该属性,我希望它失败(不抛出异常)。publicclassFoo{[MyCustomAttribute]publicStringFooString{get;set;}[MyCustomAttribute]publicStringOtherFooString{get;set;}}publicclassBar<T>whereT:class,new(){staticBar

  3. c# - 反序列化向后兼容性 - 2

    我正在尝试使用旧版本的应用程序反序列化“SomeClass”。我得到以下异常System.Runtime.Serialization.SerializationException:TheObjectManagerfoundaninvalidnumberoffixups.ThisusuallyindicatesaproblemintheFormatter.当我序列化版本0.9并尝试使用版本0.8反序列化时,反序列化抛出异常。我认为OptionalField属性可以解决问题,但事实并非如此。//Version0.8[Serializable()]classFoo{Barb;}//Versi

  4. c# - 如何使用NuGet? - 2

    我安装了NuGet,如何使用?我看了视频,我试过了>Add-Packagelog4jCommand"Add"isnotvalid.>它不起作用,我在命令行窗口中输入了它。编辑:我使用VS2010并构建WindowsForm应用程序而不是ASP.NET。 最佳答案 你有两个选择;您可以使用GUI;右键单击项目引用>添加库包引用...或者你可以使用控制台,它有更多的功能,但我不推荐它。 关于c#-如何使用NuGet?,我们在StackOverflow上找到一个类似

  5. c# - 随机字符串 c# - 2

    我想知道随机串示例字符串stringword;//Iwanttoshuffleitword="hello"我将能够得到:rand=="ohlel"rand=="lleho"etc. 最佳答案 这个解决方案(以扩展方法的形式)很好:publicstaticstringShuffle(thisstringstr){char[]array=str.ToCharArray();Randomrng=newRandom();intn=array.Length;while(n>1){n--;i

  6. c# - 无法转换 COM 对象 - Microsoft outlook 和 C# - 2

    我编写了这段代码来查看我的outlook邮箱中的未读邮件,代码如下:Microsoft.Office.Interop.Outlook.Applicationapp;Microsoft.Office.Interop.Outlook.Itemsitems;Microsoft.Office.Interop.Outlook.NameSpacens;Microsoft.Office.Interop.Outlook.MAPIFolderinbox;Microsoft.Office.Interop.Outlook.Applicationapplication=newMicrosoft.Office.

  7. c# - 以高分辨率间隔/计时器引发事件 - 2

    我想通过C#使用最高分辨率的计时器。例如,我想每11个滴答声引发一个事件(我听说滴答声是pc中可能的最高计数器)。我尝试了计时器,发现最短耗时以毫秒为单位。我查看了秒表,但秒表没有引发事件。谢谢。 最佳答案 使用多媒体计时器应该可以为您提供每秒大约1000个事件。此代码应该对您有所帮助。publicdelegatevoidTimerEventHandler(UInt32id,UInt32msg,refUInt32userCtx,UInt32rsv1,UInt32rsv2);///<summary>///Amultimed

  8. c# - 区分 short、int、long 真的很重要吗? - 2

    在我的C#应用程序中,我想知道对较小的数字使用short,对较大的数字使用int等是否真的很重要。内存消耗真的很重要吗? 最佳答案 除非您以某种结构将大量这些打包在一起,否则它可能根本不会影响内存消耗。使用特定整数类型的最佳理由是与API的兼容性。除此之外,只需确保您选择的类型有足够的范围来涵盖您需要的值。除此之外,对于简单的局部变量,它并不重要。 关于c#-区分short、int、long真的很重要吗?,我们在StackOverflow上找到一个类似的问题:

  9. c# - 如何在 C# 中读取用户环境变量? - 2

    如何读取用户特定的环境变量?我知道如何获得一个系统范围的,比如Environment.GetEnvironmentVariable("SOMETHING");提前致谢! 最佳答案 使用Environment.GetEnvironmentVariableMethod的另一个重载让您指定EnvironmentVariableTarget.Environment.GetEnvironmentVariable(variable,target);目标可以是:EnvironmentVariableTarget.Process,E

  10. c# - 关闭一个表单然后调用另一个 - 2

    我想关闭当前使用的表单(MainForm),然后打开第二个表单(Form)。我试过:privatevoidbuttonStartQuiz_Click(objectsender,EventArgse){this.Close();Form2form2=newForm2();form2.ShowDialog();}或者在form2.ShowDialog()之后添加this.Close();也不起作用。有什么提示吗?编辑:还可以通过在form2.ShowDialog()之后添加this.Close()添加它,它仅在我关闭新表单时关闭。如果我改为选择form2.Show(),它会立即关闭这两个表