实验一矩阵相乘与求逆_第1页
实验一矩阵相乘与求逆_第2页
实验一矩阵相乘与求逆_第3页
实验一矩阵相乘与求逆_第4页
实验一矩阵相乘与求逆_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验一实验一 矩阵相乘与求逆矩阵相乘与求逆 1 实验要求实验要求 1 请编出矩阵 A 和 B 相乘得到矩阵 R 的运算计算机程序 要求 A 和 B 的维数及数值可以 通过键盘及数据文件输入 计算结果 R 可由屏幕及文件输出 2 将题一的程序改为子程序 3 查找有关的资料 读懂及调通矩阵求逆子程序 并改写为子程序 2 实验过程实验过程 1 键盘输入矩阵键盘输入矩阵 A 和和 B 屏幕上显示计算结果矩阵 屏幕上显示计算结果矩阵 R include include int main int i j k m n p q printf 请输入 A 矩阵的行数 scanf d printf 请输入 A 矩阵的列数 scanf d printf 请输入 B 矩阵的行数 scanf d printf 请输入 B 矩阵的列数 scanf d if n p printf 请检查 A 矩阵的列数与 B 矩阵的行数是否一致 else double matrixA matrixB matrixC matrixA double malloc sizeof double m matrixA 0 double malloc sizeof double m n matrixB double malloc sizeof double p matrixB 0 double malloc sizeof double p q matrixC double malloc sizeof double m matrixC 0 double malloc sizeof double m q for i 1 i m i matrixA i matrixA i 1 n for i 1 i p i matrixB i matrixB i 1 q for i 1 i m i matrixC i matrixC i 1 q printf 请输入 A 矩阵的数 n for i 0 i m i for j 0 j n j scanf lf printf n 输入的 A 矩阵是 n for i 0 i m i for j 0 j n j printf 7 3lf t matrixA i j printf n printf 请输入 B 矩阵的数 n for i 0 i p i for j 0 j q j scanf lf printf n 输入的 B 矩阵是 n for i 0 i p i for j 0 j q j printf 7 3lf t matrixB i j printf n for i 0 i m i for j 0 j q j matrixC i j 0 for i 0 i m i for j 0 j q j for k 0 k n k matrixC i j matrixC i j matrixA i k matrixB k j printf n 矩阵 A B 的结果是 n for i 0 i m i for j 0 j q j printf 7 3lf t matrixC i j printf n free matrixA free matrixB free matrixC getchar getchar 运行的结果如下 2 实现文本的矩阵输入与计算结果的输出 并将相乘改为子程序 实现文本的矩阵输入与计算结果的输出 并将相乘改为子程序 include stdio h int main void matrix mutipl double matrixA double matrixB double matrixC int m int n int q char ch int m 0 n 0 p 0 q 0 i 0 j 0 k 0 char infileA 80 infileB 80 outfile 80 FILE fpin1 fpin2 fpin3 double matrixA matrixB matrixC printf Enter the infileA name n scanf s infileA if fpin1 fopen infileA r NULL printf Can t open file s n infileA exit 0 do ch fgetc fpin1 if ch t n if ch n m while feof fpin1 n n m m printf 输入的矩阵 A 行与列数分别为 d d n m n fclose fpin1 fflush stdin matrixA double malloc sizeof double m matrixA 0 double malloc sizeof double m n for i 1 i m i matrixA i matrixA i 1 n for i 0 i m i for j 0 j n j matrixA i j 0 if fpin1 fopen infileA r NULL printf Can t open file s n infileA exit 0 do ch fgetc fpin1 while feof fpin1 if feof fpin1 exit 0 ungetc ch fpin1 do i k n j k n fscanf fpin1 lf k while feof fpin1 fclose fpin1 printf 输入的 A 矩阵为 n for i 0 i m i for j 0 j n j printf lf matrixA i j printf t printf n fflush stdin printf Enter the infileB name n scanf s infileB if fpin2 fopen infileB r NULL printf Can t open file s n infileB exit 0 do ch fgetc fpin2 if ch t q if ch n p while feof fpin2 q p q p printf 输入的矩阵 B 行与列数分别为 d d n p q fclose fpin2 fflush stdin matrixB double malloc sizeof double p matrixB 0 double malloc sizeof double p q for i 1 i p i matrixB i matrixB i 1 q for i 0 i p i for j 0 j q j matrixB i j 0 if fpin2 fopen infileB r NULL printf Can t open file s n infileB exit 0 do ch fgetc fpin2 while feof fpin2 if feof fpin2 exit 0 ungetc ch fpin2 k 0 do i k q j k q fscanf fpin2 lf k while feof fpin2 fclose fpin2 printf 输入的 B 矩阵为 n for i 0 i p i for j 0 j q j printf lf matrixB i j printf t printf n fflush stdin matrixC double malloc sizeof double m matrixC 0 double malloc sizeof double m q for i 1 i m i matrixC i matrixC i 1 q for i 0 i m i for j 0 j q j matrixC i j 0 matrix mutipl double matrixA double matrixB double matrixC m n q printf 矩阵 A B 为 n for i 0 i m i for j 0 j q j printf lf matrixC i j printf t printf n fflush stdin printf Enter the outfile name n scanf s outfile if fpin3 fopen outfile w NULL printf Can t open file s n outfile exit 0 for i 0 i m i for j 0 j q j fprintf fpin3 lf matrixC i j fprintf fpin3 t fprintf fpin3 n fflush stdin getchar void matrix mutipl double matrixA double matrixB double matrixC int m int n int q int k 0 j 0 i 0 for i 0 i m i for j 0 j q j for k 0 k n k matrixC i j matrixC i j matrixA i k matrixB k j 运行结果如下 文本文件 1 dat 和 2 dat 需要放在程序的同一文件夹下 否则需要说明路径 3 矩阵求逆子程序矩阵求逆子程序 include stdio h include malloc h include math h void main int inv double p int n double a 4 4 1 2 0 0 1 2 0 0 0 0 3 0 0 0 0 1 ab ab a 0 int n 4 i 0 j i inv ab n if i 0 for i 0 i n i putchar n for j 0 j n j printf f a i j getchar int inv double p int n void swap double a double b int is js i j k l for i 0 i n i putchar n for j 0 j n j printf f p i n j puts n n n n double temp fmax is int malloc n sizeof int js int malloc n sizeof int for k 0 k n k fmax 0 0 for i k i n i for j k jfmax fmax temp is k i js k j if fmax 1 0 1 0 free is free js printf no inv return 0 if i is k k for j 0 j n j swap p k n j p i n j if j js k k for i 0 i n i swap p i n k p i n j p k n k 1 0 p k n k for j 0 j n j if j k p k n j p k n k for i 0 i n i if i k for j 0 j n j if j k p i n j p i n j p i n k p k n j for i 0 i 0 k if j js k k for i 0 i n i swap p j n i p k n i if i is k k for j 0 j n j swap p j n i p j n k free is free js return 1 void swap double a double b double c c a a b b c 如上所示 本子程序先将输入的矩阵进行全对角占优的方法 避免了矩阵处理过程中 的 病态 情况 3 实验总结实验总结 在整个实验过程中 出现了三个问题 1 文本输入是实现矩阵相乘的重要点 由于本人在实验的文本文件中加了一些提示语言 因此需要判断何时是数据 再进行矩阵数据的读入 因此增加了一个数据判断过程 2 矩阵程序改为子程序时 需要实现地址之间的传递 我们不能简单地进行 matrixA i j 处理 应该改为 matrixA i j 进行处理 而且还要实现二维数组的动态分配存储空间 如下 double matrixA matrixA double malloc sizeof double m matrixA 0 double malloc sizeof double m n for i 1 i m i matrixA i matrixA i 1 n for i 0 i m i for j 0 j n j matrixA i j 0 最后的动态数组赋初值也是很重要的 否则在数据处理过程中会出现错误 3 矩阵求逆的子程序中 需要先对矩阵进行全对角占优的处理 能很好避免数据处理过程 中一些 病态 的处理 而且能避免复杂的计算量问题 实验二实验二 M 序列的生成与输出计算序列的生成与输出计算 1 实验要求实验要求 编写并调试动态模型仿真程序 模型 2 5 0 1 2 7 0 1 5 1 kvkukukykyky 已知白噪声 v k 数据文件为 DV 数据长度 L 500 要求 1 产生长度为 L 的 M 序列数据文件 2 产生长度为 L 的模型输出数据文件 DY 2 实验过程实验过程 1 产生产生 M 序列序列 M 序列是一种幅值为二值的伪随机序列 周期 2n 1 其中 n 为系统的阶次 即辨识 的参数的个数 有两种产生方法 1 采用随机函数 即先随机一个周期的 M 序列的值 a 或 a 再据此更新其他的数据即 可 include include include include main int i k n 3 m 2 p int a mfuc FILE fp p pow m n 1 a int malloc sizeof int p mfuc int malloc sizeof int 500 srand unsigned time NULL for i 0 i p i a i 0 for i 0 i p i a i 0 5 float rand RAND MAX 1 a i 2 a i 1 printf d n a i printf n n n n n for i 0 i 500 i k i p mfuc i a k printf d n mfuc i if fp fopen m dat w NULL printf Cannot open this file n exit 0 for i 0 i 500 i fprintf fp d mfuc i fputc n fp fclose fp fflush stdin getchar 2 M 序列用模二加和门电路生成 我们以 4 阶的进行说明 首先给 4 个初始状态 如 0001 再下一位的数据为该数据的前面第 3 4 位数据的异或值 一次循环下去 就可以得 到一个周期为 15 的 M 序列 因为均值需要为 0 我们这里命 0 为 1 实验程序如下 include main int i 0 int a 1 b 1 c 1 d 1 e 0 int m 500 int m1 m1 int malloc sizeof int m FILE fpin printf d n a printf d n b printf d n c printf d n d m1 0 a m1 1 b m1 2 c m1 3 d for i 4 i m i e a a b b c c d if e a d 1 else d 1 printf d n d m1 i d if fpin fopen u dat w NULL printf Cannot open this file n exit 0 for i 0 i m i fprintf fpin d m1 i fputc n fpin fclose fpin free m1 fflush stdin getchar 在上面程序运行过后 会生成一个 u dat 的文件 即为以后的输入的数据 2 y 值的输出 输入的值选用前面我们生成的 M 序列 这样可以开始计算对应的输出值 这里还有白 噪声的干扰 具体的编程如下 include main int i int num 500 FILE fpu fpy fpdv double u 500 dv 500 y 500 double u k1 0 u k2 0 y k 0 y k1 0 y k2 0 for i 0 i num i u i 0 dv i 0 if fpu fopen u dat r NULL printf Cannot open u dat file n exit 0 i 0 do fscanf fpu lf i while feof fpu fclose fpu if fpdv fopen DV r NULL printf Cannot open DV file n exit 0 i 0 do fscanf fpdv lf i while feof fpdv fclose fpdv y 0 0 y 1 0 for i 2 i num i u k1 u i 1 u k2 u i 2 y k 1 5 y k1 0 7 y k2 u k1 0 5 u k2 dv i 2 y i y k y k2 y k1 y k1 y i for i 0 i num i printf lf n y i if fpy fopen y dat w NULL printf Cannot open y dat file n exit 0 for i 0 i num i fprintf fpy lf y i fputc n fpy fclose fpy fflush stdin getchar 通过上面的程序 我们可以得到一个 y dat 的数据输出数据 方便我们以后调用 三 实验分析三 实验分析 1 采用 M 序列来替代白噪声 是因为它没有白噪声的缺点 如 要求无限长时间等 但 它是接近白噪声的 是比较理想的辨识输入的激励信号 2 数据的输出值 我们是根据离散函数进行计算的 是一种理论的数据输出 我们在此加 上白噪声 以模仿实际的数据输出 实验三实验三 成批最小二乘法 成批最小二乘法 BLS 1 实验要求实验要求 编写并调试动态离散时间模型 LS 成批算法程序 要求 1 原始数据由 DU 和 DY 读出 2 调用求逆及相乘子程序 3 显示参数辨识结果 二 实验过程二 实验过程 1 成批最小二乘法的计算流程成批最小二乘法的计算流程 系统模型 2 1 2 1 2121 kvnkubkubkubnkyakyakyaky nn 或写成 11 kvkuqBkyqA 其中 u k 我们选为 M 序列产生的数据 即 u dat 里的数据 v k 为白色随机噪声 即可写成以下形式 kvkxky T 式中 T nkukunkykykx 1 1 2121nn bbbaaa 对于 k n 1 n 2 n m 以上方程可以构成一个线性方程组 可以写成 VXY 其中 T T mnvnvnvV mnynynyY 2 1 2 1 1 1 2 1 2 1 1 1 1 1 mumnumnumymnymny ununuynyny ununuynyny X 参数估计YXXX TT1 其中 u k 应取 1 随机序列 白噪声 2 伪随即序列 M 序列 2 具体的程序如下 具体的程序如下 include main void matrix mutipl float matrixA float matrixB float matrixC int m int n int q float inv float p int n void swap double a double b int i j float u 500 float y x xt c d o yt y float malloc sizeof float 500 y 0 float malloc sizeof float 500 1 for i 1 i 500 i y i y i 1 1 x float malloc sizeof float 498 x 0 float malloc sizeof float 498 4 for i 1 i 498 i x i x i 1 4 xt float malloc sizeof float 4 xt 0 float malloc sizeof float 4 498 for i 1 i 4 i xt i xt i 1 498 c float malloc sizeof float 4 c 0 float malloc sizeof float 4 4 for i 1 i 4 i c i c i 1 4 d float malloc sizeof float 4 d 0 float malloc sizeof float 4 498 for i 1 i 4 i d i d i 1 498 o float malloc sizeof float 4 o 0 float malloc sizeof float 4 1 for i 1 i 4 i o i o i 1 1 yt float malloc sizeof float 498 yt 0 float malloc sizeof float 498 1 for i 1 i 498 i yt i yt i 1 1 for i 0 i 500 i u i 0 for i 0 i 500 i y i 1 0 for i 0 i 498 i for j 0 j 4 j x i j 0 for i 0 i 4 i for j 0 j 498 j xt i j 0 for i 0 i 4 i for j 0 j 4 j c i j 0 for i 0 i 4 i for j 0 j 498 j d i j 0 for i 0 i 4 i for j 0 j 1 j o i j 0 for i 0 i 498 i for j 0 j 1 j yt i j 0 FILE fpdu fpdy if fpdu fopen u dat r NULL printf Can t open file u dat n exit 0 i 0 do fscanf fpdu f i while feof fpdu fclose fpdu if fpdy fopen y dat r NULL printf Can t open file y dat n exit 0 i 0 do fscanf fpdy g i while feof fpdy fclose fpdy for i 0 i 498 i for j 0 j 1 j yt i j y i 2 j for j 0 j 2 j for i 0 i 498 i x i j 1 y i j 1 0 for j 2 j 4 j for i 0 i 498 i x i j u i j 3 for i 0 i 498 i for j 0 j 4 j xt j i x i j matrix mutipl float xt float x float c 4 498 4 i inv c 4 if i 0 for i 0 i 4 i putchar n for j 0 j 4 j printf f c i j matrix mutipl float c float xt float d 4 4 498 matrix mutipl float d float yt float o 4 498 1 printf n n for i 0 i 4 i printf g n o i 0 getchar void matrix mutipl float matrixA float matrixB float matrixC int m int n int q int k 0 j 0 i 0 for i 0 i m i for j 0 j q j for k 0 k n k matrixC i j matrixC i j matrixA i k matrixB k j float inv float p int n void swap double a double b int is js i j k l for i 0 i n i putchar n for j 0 j n j printf f p i n j puts n n n n double temp fmax is int malloc n sizeof int js int malloc n sizeof int for k 0 k n k fmax 0 0 for i k i n i for j k jfmax fmax temp is k i js k j if fmax 1 0 1 0 free is free js printf no inv return 0 if i is k k for j 0 j n j swap p k n j p i n j 交换指针 if j js k k for i 0 i n i swap p i n k p i n j 交换指针 p k n k 1 0 p k n k for j 0 j n j if j k p k n j p k n k for i 0 i n i if i k for j 0 j n j if j k p i n j p i n j p i n k p k n j for i 0 i 0 k if j js k k for i 0 i n i swap p j n i p k n i if i is k k for j 0 j n j swap p j n i p j n k free is free js return 1 void swap double a double b double c c a a b b c 运行的实验结果如下 三 实验分析三 实验分析 1 在运算过程会出现求逆的过程 因此会不可避免地增加整个运算量 尤其是当整个系统 的阶次较高时候 会占用较大内存 2 由于运算的结果相乘等处理过程中 会不可避免地出现偏差 如上 我们得到的最大的 数据误差为 4 8 已经能较好地辨识系统参数 3 成批最小二乘法不适合系统的在线辨识 实验四实验四 递推最小二乘法 递推最小二乘法 RLS 1 实验要求实验要求 编写并调试动态离散时间模型 LS 递推算法程序 要求 1 原始数据由 DU 和 DY 读出 2 显示辨识结果 3 设置选择变量决定是否输出中间结果 二 实验过程二 实验过程 1 递推最小二乘法的原理递推最小二乘法的原理 由于成批最小二乘法存在大矩阵的求逆运算 而且占用内存较多 不适合在线辨识 我们出现了递推最小二乘法 它的基本思想是 新的估计值 k 1 老的估计值 k 修正项 模型 2 1 2 1 2121 kvnkubkubkubnkyakyakyaky nn 1 1 1 1 1 1 1 1 1 1 1 1 1 1 kxkpkxk kpkxkxkpkkpkp kkxkykxkpkkk T T T 其中的 x k 为 2n 1 维的 为 2n 1 维 T nn T bbbaaa nkukunkykykx 1 1 2121 y k 1 测量值 标量 P k 信息阵 2n 2n 对称方阵 k 修正系数 标量 递推的框图如下 3 初值选取 P 0 aI a 为足够大的正数 105 1012 0 为足够小的数 0 4 输入信号 u k 一般取 M 序列 2 实验编程如下 实验编程如下 include include main void matrix mutipl float matrixA float matrixB float matrixC int m int n int q int i j k a 0 FILE fpdu fpdy float u 500 float r 0 deta 0 float y x o p xt m1 m2 m3 m4 m5 y float malloc sizeof float 500 y 0 float malloc sizeof float 500 1 for i 1 i 500 i y i y i 1 1 for i 0 i 500 i y i 0 0 for i 0 i 500 i u i 0 x float malloc sizeof float 4 x 0 float malloc sizeof float 4 1 for i 1 i 4 i x i x i 1 1 for i 0 i 4 i x i 0 0 o float malloc sizeof float 4 o 0 float malloc sizeof float 4 1 for i 1 i 4 i o i o i 1 1 for i 0 i 4 i o i 0 0 p float malloc sizeof float 4 p 0 float malloc sizeof float 4 4 for i 1 i 4 i p i p i 1 4 for i 0 i 4 i for j 0 j 4 j if i j p i j pow 10 6 else p i j 0 xt float malloc sizeof float 1 xt 0 float malloc sizeof float 1 4 for i 1 i 1 i xt i xt i 1 4 for i 0 i 4 i xt 0 i 0 m1 float malloc sizeof float 1 m1 0 float malloc sizeof float 1 4 for i 1 i 1 i m1 i m1 i 1 4 for i 0 i 4 i m1 0 i 0 m2 float malloc sizeof float 1 m2 0 float malloc sizeof float 1 1 for i 1 i 1 i m2 i m2 i 1 1 for i 0 i 1 i m2 0 i 0 m3 float malloc sizeof float 1 m3 0 float malloc sizeof float 1 1 for i 1 i 1 i m3 i m3 i 1 1 for i 0 i 1 i m3 0 i 0 m4 float malloc sizeof float 4 m4 0 float malloc sizeof float 4 1 for i 1 i 4 i m4 i m4 i 1 1 for i 0 i 4 i m4 i 0 0 m5 float malloc sizeof float 4 m5 0 float malloc sizeof float 4 4 for i 1 i 4 i m5 i m5 i 1 4 for i 0 i 4 i for j 0 j 4 j m5 i j 0 if fpdu fopen u dat r NULL printf Can t open file u dat n exit 0 i 0 do fscanf fpdu g i whi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论