C语言解算状态空间方程(基于四阶龙格库塔)

本文详细描述了如何利用四阶龙格库塔法对线性系统进行状态更新,通过矩阵运算处理A、B、C和D矩阵,实现输入u的仿真并计算输出Y。
摘要由CSDN通过智能技术生成
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
	printf("--------------------------------------------------------------------------\r\n");
	printf("--------------------------------------------------------------------------\r\n");
	printf("--------------------------------------------------------------------------\r\n");
	
	

	const double h = 0.001;//周期
	const int n = 4;//A矩阵的行数
	const int m = 1;//B矩阵的列数
	const int r = 3;//C矩阵的行数
	double k1[n];//k1的维数由A矩阵的行数决定
	double k2[n];//k2的维数由A矩阵的行数决定
	double k3[n];//k3的维数由A矩阵的行数决定
	double k4[n];//k4的维数由A矩阵的行数决定

	double X0_init = 0;//X0状态初始值,默认设置为0
	double A[n][n] = { 0, 1, 0, 0, -1, 0, 1, 0,0, 0, 0, 1, 1, 0, -1, 0 };//A矩阵定义
	double B[n][m] = {0,1,0,0};//B矩阵定义
	double C[r][n] = {1,0,0,0,0,0,1,0,0,0,1,0};//C矩阵定义
	double D[r][m] = {0,0,0};//D矩阵定义
	
	static double X0[n] = {0,0,0,0};//X0状态初始向量定义
	
	double u[m] = {0.1};//输入不定维数的U向量
	double u1[m];//计算K2时的中间变量
	double Ax0[n];//AX0乘积数组
	double Bu[n];//Bu的乘积
	double h_2_Ak1[n];//k2中的中间变量h/2Ak1
	double Bu1[n];//计算四阶龙格库塔k2中的B*(u + h / 2)
	double h_2_Ak2[n];//k3中的中间变量h/2Ak2
	double h_Ak3[n];//计算K4中的中间变量h*A*k3
	double u2[m];//计算K4时的中间变量
	double Bu2[n];//计算四阶龙格库塔k4中的B*(u + h)
	double Cx[r];//
	double Du[r];
	double Y[r];
	FILE* outFile;
	outFile = fopen("Data.txt", "w");

	for (int total = 0; total < 3000; total++) {
		//printf("++++++++++%d\r\n", total+1);
		//Ax0计算
		for (int i5 = 0; i5 < n; i5++)
		{
			for (int j5 = 0; j5 < 1; j5++)
			{
				double temp = 0.0;
				for (int k5 = 0; k5 < n; k5++)
				{
					temp += A[i5][k5] * X0[k5];
				}
				Ax0[i5] = temp;// 0 0 0 0
				//printf("Ax0:%lf\r\n", Ax0[i5]);
			}
		}

		//B*U乘积计算	
		for (int i6 = 0; i6 < n; i6++)
		{
			for (int j6 = 0; j6 < 1; j6++)
			{
				double temp1 = 0.0;
				for (int k6 = 0; k6 < m; k6++)
				{
					temp1 += B[i6][k6] * u[k6];
				}
				Bu[i6] = temp1;// 0 1 0 0
				//printf("Bu:%lf\r\n", Bu[i6]);
			}
		}
#
		//四阶龙格库塔计算K1
		for (int i7 = 0; i7 < n; i7++)
		{

			k1[i7] = Ax0[i7] + Bu[i7];// 0 1 0 0
			//printf("K1:%lf\r\n", k1[i7]);

		}

		//四阶龙格库塔中的k2中的(h/2)A(K1)
		for (int i8 = 0; i8 < n; i8++)
		{
			for (int j8 = 0; j8 < 1; j8++)
			{
				double temp2 = 0.0;
				for (int k8 = 0; k8 < n; k8++)
				{
					temp2 += A[i8][k8] * k1[k8];
				}
				h_2_Ak1[i8] = h / 2 * temp2;// 1 1 1 1
				//printf("h_2_Ak1:%lf\r\n", h_2_Ak1[i8]);
			}
		}

		//计算四阶龙格库塔k2中的(u+h/2)
		for (int i9 = 0; i9 < m; i9++)
		{

			u1[i9] = u[i9] + h / 2;// 2
			//printf("u1:%lf\r\n", u1[i9]);
		}

		//计算四阶龙格库塔k2中的B*(u+h/2)
		for (int i10 = 0; i10 < n; i10++)
		{
			for (int j10 = 0; j10 < 1; j10++)
			{
				double temp3 = 0.0;
				for (int k10 = 0; k10 < m; k10++)
				{
					temp3 += B[i10][k10] * u1[k10];
				}
				Bu1[i10] = temp3;// 0 2 0 0
				//printf("Bu1:%lf\r\n", Bu1[i10]);
			}
		}

		//计算四阶龙格库塔K2
		for (int i11 = 0; i11 < n; i11++)
		{
			k2[i11] = Ax0[i11] + h_2_Ak1[i11] + Bu1[i11];// 1 3 1 1
			//printf("K2:%lf\r\n", k2[i11]);
		}


		//首先计算k3中的(h/2)Ak2
		for (int i12 = 0; i12 < n; i12++)
		{
			for (int j12 = 0; j12 < 1; j12++)
			{
				double temp4 = 0.0;
				for (int k12 = 0; k12 < n; k12++)
				{
					temp4 += A[i12][k12] * k2[k12];
				}
				h_2_Ak2[i12] = h / 2 * temp4;// 6 6 6 6
				//printf("h_2_Ak2:%lf\r\n", h_2_Ak2[i12]);
			}
		}

		//计算龙格库塔K3
		for (int i13 = 0; i13 < n; i13++)
		{
			k3[i13] = Ax0[i13] + h_2_Ak2[i13] + Bu1[i13];// 6 8 6 6
			//printf("k3:%lf\r\n", k3[i13]);
		}

		//计算龙格库塔k4的h*A*k3
		for (int i14 = 0; i14 < n; i14++)
		{
			for (int j14 = 0; j14 < 1; j14++)
			{
				double temp5 = 0.0;
				for (int k14 = 0; k14 < n; k14++)
				{
					temp5 += A[i14][k14] * k3[k14];
				}
				h_Ak3[i14] = h * temp5;//52 52 52 52
				//printf("h_Ak3:%lf\r\n", h_Ak3[i14]);
			}
		}

		//计算龙格库塔K4中间变量u+h
		for (int i15 = 0; i15 < m; i15++)
		{
			u2[i15] = u[i15] + h;//3
			//printf("u2:%lf\r\n", u2[i15]);
		}

		//计算四阶龙格库塔k4中的B*(u+h)
		for (int i16 = 0; i16 < n; i16++)
		{
			for (int j16 = 0; j16 < 1; j16++)
			{
				double temp6 = 0.0;
				for (int k16 = 0; k16 < m; k16++)
				{
					temp6 += B[i16][k16] * u2[k16];
				}
				Bu2[i16] = temp6;// 0 3 0 0
				//printf("Bu2:%lf\r\n", Bu2[i16]);
			}
		}

		//计算四阶龙格库塔k4
		for (int i17 = 0; i17 < n; i17++)
		{

			k4[i17] = Ax0[i17] + h_Ak3[i17] + Bu2[i17];//52 55 52 52
			//printf("k4:%lf\r\n", k4[i17]);
		}

		//更新x0
		for (int i18 = 0; i18 < n; i18++)
		{
			X0[i18] = X0[i18] + h / 6 * (k1[i18] + 2 * k2[i18] + 2 * k3[i18] + k4[i18]);// 22 26 22 22
			//printf("X0:%lf\r\n", X0[i18]);
		}

		//计算y输出中间变量CX

		for (int i19 = 0; i19 < r; i19++)
		{
			for (int j19 = 0; j19 < 1; j19++)
			{
				double temp7 = 0.0;
				for (int k19 = 0; k19 < n; k19++)
				{
					temp7 += C[i19][k19] * X0[k19];

				}
				Cx[i19] = temp7;// 22 22 22
				//printf("Cx:%lf\r\n", temp7);
			}
		}

		//计算y输出中间变量du
		for (int i20 = 0; i20 < r; i20++)
		{
			for (int j20 = 0; j20 < 1; j20++)
			{
				double temp8 = 0.0;
				for (int k20 = 0; k20 < m; k20++)
				{
					temp8 += D[i20][k20] * u[k20];
				}
				Du[i20] = temp8;//0 0 0
				//printf("Du:%lf\r\n", Du[i20]);
			}
		}

		//计算y最终值
		for (int i21 = 1; i21 < 2; i21++)
		{
			Y[i21] = Cx[i21] + Du[i21];//22 22 22
			printf("%.16lf\r\n", Y[i21]);
			fprintf(outFile, "%.16lf\n", Y[i21]);
		}
	}
	fclose(outFile);


	
 
return 1;



}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值