用C求解求常微分方程组组的方法?

查看: 2714|回复: 9|关注: 0
怎样用SIMULINK解系数为矩阵的常微分方程组
怎样用SIMULINK解系数为矩阵的常微分方程组,具体形式如下:AX''+BX-f(X,t)=C,其中A,B,C,f均为矩阵。
当X的维数为20*1的时候,就是20个常微分方程组,想用SIMULINK解这个方程组,但总不能化为20个常微分方程,然后一个一个地搭方程吧?那图形太复杂和庞大了。能不能借助s函数,但怎样表达矩阵呢,输入输出都怎么设置?能不能列一个3维的例子说明一下。谢谢,感激不尽。
关注者: 285
Simulink里的gain模块支持矩阵相乘的。楼主可以按照一个方程搭建试试,看看有没有不支持矩阵运算的模块。
Simulink里的gain模块支持矩阵相乘的。楼主可以按照一个方程搭建试试,看看有没有不支持矩阵运算的模块。 ...
您好,我的每个方程里面不是单独的状态变量,矩阵B不是对角阵。这个时候怎么办呢,不能用一个方程做实验。
关注者: 285
本帖最后由 hyowinner 于
10:15 编辑
您好,我的每个方程里面不是单独的状态变量,矩阵B不是对角阵。这个时候怎么办呢,不能用一个方程做实验 ...
我不是说将里面抽出一个单元素建模,而是说直接使用矩阵相乘的方式,将整体作为一个方程来建立。constant里可以写矩阵,gain也支持矩阵运算,积分器也可以支持矩阵运算,其初始值可以通过zeros(3,2)这种方式设置。
Simulink里的gain模块支持矩阵相乘的。楼主可以按照一个方程搭建试试,看看有没有不支持矩阵运算的模块。 ...
如果s函数的输入是一个向量,我怎样在这个s函数里面表示向量中的某一变量呢?向量是N*1维的
关注者: 285
本帖最后由 hyowinner 于
10:32 编辑
如果s函数的输入是一个向量,我怎样在这个s函数里面表示向量中的某一变量呢?向量是N*1维的 ...
M Level1/2 S function吗?
u(n), n = 1,2,3, max
即表示当前采样时间输入向量的某一维。
话说你的常微分方程不是很简单的结构吗,不需要用S函数来描述。
直接使用积分器和四则运算搭建不是很简单吗。
参考这个帖子:
M Level1/2 S function吗?
u(n), n = 1,2,3, max
即表示当前采样时间输入向量的某一维。
我的系数矩阵是11*11,或者更大的,要是用constant和gain模块,就在模块设置里面直接输入这么长的矩阵吗,要关于F的矩阵,它是一个跟状态变量x有关的矩阵怎么办
关注者: 285
我的系数矩阵是11*11,或者更大的,要是用constant和gain模块,就在模块设置里面直接输入这么长的矩阵吗 ...
可以啊,Constant,Gain,Integrator都可以输入这么大的矩阵。
可以啊,Constant,Gain,Integrator都可以输入这么大的矩阵。
z.jpg (31.17 KB, 下载次数: 14)
15:49 上传
这是我用simulink仿真的图形,我将矩阵都用s函数描述。其中k矩阵的内容为
k.jpg (161.83 KB, 下载次数: 0)
15:49 上传
,运行时,出现错误
error.jpg (34.28 KB, 下载次数: 0)
15:51 上传
.这是什么原因,是因为s函数不能输出矩阵,还是因为我运行时没有对X,Y赋初值,要想赋初值的话,怎么付,X,Y是个矩阵都是11*1的矩阵。
关注者: 285
这是我用simulink仿真的图形,我将矩阵都用s函数描述。其中k矩阵的内容为,运行时,出现错误.这是什么原 ...
你这个问题不要用S函数、上面几楼给过你例子和讲解,直接做就行了,没有必要把简单问题做那么复杂。
站长推荐 /2
Powered by小木虫 --- 500万硕博科研人员喜爱的学术科研平台
&&查看话题
关于matlab求解常微分方程或者常微分方程组
请问,matlab可以求解除了未知变量(比如常见的x,t),式中还具有一些参数变量(如a,b,c...)的常微分方程组不?也就是求一个常微分方程的解析解,解的形式中有参数变量符号。。。
附:给定未知变量的初始条件
先谢谢大家。。。
解析解呢?
大部分问题的解析解几乎不可能得到
谢谢亲啦~
研究生必备与500万研究生在线互动!
扫描下载送金币 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
Excel 求解常微分方程组的两种方法
下载积分:1500
内容提示:Excel 求解常微分方程组的两种方法,求解,方法,两种,常微分方程组,Excel,Ex cel,Excel的,excel,线性方程组求解,微分方程组,一阶微分方程组,线性微分方程组
文档格式:PDF|
浏览次数:116|
上传日期: 05:50:30|
文档星级:
该用户还上传了这些文档
Excel 求解常微分方程组的两种方法
官方公共微信& & & & & & & &本博客所有文章分类的总目录:&
开源Math.NET基础数学类库使用总目录:
  在前几篇关于Math.NET的博客中(见上面链接),主要是介绍了Math.NET中主要的数值功能,并进行了简单的矩阵向量计算例子,接着使用Math.NET的矩阵等对象,对3种常用的矩阵数据交换格式的读写。一方面可以了解Math.NET的使用,另一方面以后也可以直接读取和保存数据为这两种格式,给大家的科研或者工作带来便利。接下来的文章将继续对Math.NET的功能进行讲解和演示,并附带一些数学方面的基础知识。毕竟很多人没有精力去研究Math.NET,那我就把我的研究心得一一写出来,方便后来人。
1.数值分析与线性方程
  数值分析的基本含义与特点:
  数值分析(numerical analysis)是研究分析用计算机求解数学计算问题的数值计算方法及其理论的学科,是数学的一个分支,它以数字计算机求解数学问题的理论和方法为研究对象。为计算数学的主体部分。数值分析有如下特点:1&面向计算机2&有可靠的理论分析3&要有好的计算复杂性4&要有数值实验5.要对算法进行误差分析  
  数值分析的主要内容:插值法,函数逼近,曲线拟和,数值积分,数值微分,解线性方程组的直接方法,解线性方程组的迭代法,非线性方程求根,常微分方程的数值解法。
  所以我们今天要解决的就是数值分析的一个很小但又最常接触到的部分,方程(组)的求解。方程(组)的求解有2种方法,一种是直接求解,一种是迭代求解。直接方法比较好理解,相当与使用公式进行直接计算,结果也比较精确。而另外一种是迭代方法。从最初的猜测,迭代方法逐次近似形式收敛只在极限的精确解。
  正如上面所说,方程(组)的形式很多,不同的形式以及实际要求的精度都可以使用不同的方法,而本文主要介绍最简单,也是最常见的线性方程的直接求解方法。
2.Math.NET解线性方程源码分析
  本文首先对Math.NET中求解线性方程的相关源码进行分析,这样大家碰到了问题,也可以更好的查找源码解决,或者进行扩展,实现自己的一些特殊需求。Math.NET中MathNet.Numerics.LinearAlgebra.Factorization命名空间下有一个泛型接口:ISolver&T&,就是解AX = B类型的线性方程的接口类型。该接口功能很多,看看下面的接口源代码和注释(本人进行了简单的翻译),就很清楚了。
3 namespace MathNet.Numerics.LinearAlgebra.Factorization
/// &summary&形如AX = B的线性方程组求解的接口类型&/summary&
/// &typeparam name="T"&泛型参数,支持类型有:double, single, &see cref="Complex"/&,
/// 以及 &see cref="Complex32"/&.&/typeparam&
public interface ISolver&T& where T : struct, IEquatable&T&, IFormattable
/// &summary&求解AX=B的线性方程组&/summary&
/// &param name="input"&右矩阵&c&B&/c&.&/param&
/// &returns&返回求解结果矩阵 &c&X&/c&.&/returns&
Matrix&T& Solve(Matrix&T& input);
/// &summary&求解AX=B的线性方程组&/summary&
/// &param name="input"&右矩阵 &c&B&/c&.&/param&
/// &param name="result"&求解结果矩阵, &c&X&/c&.&/param&
void Solve(Matrix&T& input, Matrix&T& result);
/// &summary&求解AX=b的线性方程组&/summary&
/// &param name="input"&等式的右边向量 &c&b&/c&.&/param&
/// &returns&返回求解结果的左边向量 , &c&x&/c&.&/returns&
Vector&T& Solve(Vector&T& input);
/// &summary&求解AX=b的线性方程组&/summary&
/// &param name="input"&等式的右边向量 &c&b&/c&.&/param&
/// &param name="result"&求解结果矩阵, &c&x&/c&.&/param&
void Solve(Vector&T& input, Vector&T& result);
&由于求解线性方程组主要用到了矩阵的分解,Math.NET实现了5种矩阵分解的算法:LU,QR,Svd,Evd,Cholesky。而GramSchmidt是继承QR的,每一个都是实现了ISolver&T&接口,因此就可以直接使用矩阵的分解功能,直接进行线性方程组的求解。为了方便,我们举一个LU的源码例子,简单的看看源码的基本情况:
1 public abstract class LU&T& : ISolver&T& where T : struct, IEquatable&T&, IFormattable
static readonly T One = BuilderInstance&T&.Matrix.O
readonly Lazy&Matrix&T&& _lazyL;
readonly Lazy&Matrix&T&& _lazyU;
readonly Lazy&Permutation& _lazyP;
protected readonly Matrix&T& F
protected readonly int[] P
protected LU(Matrix&T& factors, int[] pivots)
_lazyL = new Lazy&Matrix&T&&(ComputeL);
_lazyU = new Lazy&Matrix&T&&(Factors.UpperTriangle);
_lazyP = new Lazy&Permutation&(() =& Permutation.FromInversions(Pivots));
Matrix&T& ComputeL()
var result = Factors.LowerTriangle();
for (var i = 0; i & result.RowC i++)
result.At(i, i, One);
/// &summary&Gets the lower triangular factor.&/summary&
public Matrix&T& L
get { return _lazyL.V }
/// &summary&Gets the upper triangular factor.&/summary&
public Matrix&T& U
get { return _lazyU.V }
/// &summary&Gets the permutation applied to LU factorization.&/summary&
public Permutation P
get { return _lazyP.V }
/// &summary&Gets the determinant of the matrix for which the LU factorization was computed.&/summary&
public abstract T Determinant { get; }
public virtual Matrix&T& Solve(Matrix&T& input)
var x = Matrix&T&.Build.SameAs(input, input.RowCount, input.ColumnCount);
Solve(input, x);
public abstract void Solve(Matrix&T& input, Matrix&T& result);
public virtual Vector&T& Solve(Vector&T& input)
var x = Vector&T&.Build.SameAs(input, input.Count);
Solve(input, x);
public abstract void Solve(Vector&T& input, Vector&T& result);
public abstract Matrix&T& Inverse();
  大家可能会注意到,上面是抽象类,这和Math.NET的实现是有关的。最终都是实现相应版本的Matrix矩阵,然后实现对应版本的类型的分解方法。下面例子会介绍具体使用,大家有疑问,可以拿着源码和例子,调试一番,知道上面的2个实现过程,就比较简单了
3.Math.NET求解线性方程的实例
&  假设下面是要求解的线性方程组(Ax=b):
5*x + 2*y &- 4*z = -73*x - &7*y + 6*z = 384*x + 1*y + 5*z = 43
&测试代码,由于求解的方法很多,只列举了几种,其他的以此类推:
1 var formatProvider = (CultureInfo) CultureInfo.InvariantCulture.Clone();
2 formatProvider.TextInfo.ListSeparator = " ";
4 //先创建系数矩阵A
5 var matrixA = DenseMatrix.OfArray(new[,] {{5.00, 2.00, -4.00}, {3.00, -7.00, 6.00}, {4.00, 1.00, 5.00}});
7 //创建向量b
8 var vectorB = new DenseVector(new[] {-7.0, 38.0, 43.0});
10 // 1.使用LU分解方法求解
11 var resultX = matrixA.LU().Solve(vectorB);
12 Console.WriteLine(@"1. Solution using LU decomposition");
13 Console.WriteLine(resultX.ToString("#0.00\t", formatProvider));
15 // 2.使用QR分解方法求解
16 resultX = matrixA.QR().Solve(vectorB);
17 Console.WriteLine(@"2. Solution using QR decomposition");
18 Console.WriteLine(resultX.ToString("#0.00\t", formatProvider));
20 // 3. 使用SVD分解方法求解
21 matrixA.Svd().Solve(vectorB, resultX);
22 Console.WriteLine(@"3. Solution using SVD decomposition");
23 Console.WriteLine(resultX.ToString("#0.00\t", formatProvider));
25 // 4.使用Gram-Shmidt分解方法求解
26 matrixA.GramSchmidt().Solve(vectorB, resultX);
27 Console.WriteLine(@"4. Solution using Gram-Shmidt decomposition");
28 Console.WriteLine(resultX.ToString("#0.00\t", formatProvider));
30 // 5.验证结果,就是把结果和A相乘,看看和b是否相等
31 var reconstructVecorB = matrixA*resultX;
32 Console.WriteLine(@"5. Multiply coefficient matrix 'A' by result vector 'x'");
33 Console.WriteLine(reconstructVecorB.ToString("#0.00\t", formatProvider));
结果如下:&
1. Solution using LU decomposition
DenseVector 3-Double
2. Solution using QR decomposition
DenseVector 3-Double
3. Solution using SVD decomposition
DenseVector 3-Double
4. Solution using Gram-Shmidt decomposition
DenseVector 3-Double
5. Multiply coefficient matrix 'A' by result vector 'x'
DenseVector 3-Double
  今天的用法就到此为止,请关注博客,后续还有更多的分析和使用文章。
  如果本文资源或者显示有问题,请参考&:
阅读(...) 评论()

我要回帖

更多关于 求常微分方程组 的文章

 

随机推荐