C/C++ 语言实现使用LU分解求解线性方程组

应用计算方法C语言程序:02

接应用计算方法C语言程序:01:C/C++ 语言实现矩阵LU分解:Doolittle(A)

以计算方法课本例题4-6为例。
在这里插入图片描述
设矩阵A,b分别为:A[3][3] = { {1,3,3},{2,1,1},{2,3,4} }; b[3] = { 1,2,1 };
利用C语言程序求解方程组如下:(其中LU分解程序见应用计算方法C语言程序:01
程序中矩阵求逆部分程序使用了博友(重中之重小星星)的程序(感谢博主的分享):原文链接

void Matrix_inverse(double arc[3][3], int n, double ans[3][3])//计算矩阵的逆
{
	int i, j, k;//列
	double max, tempA, tempB, P;
	int max_num;
	double arcs[3][3];
	memcpy(arcs, arc, n*n*sizeof(double));
	for (i = 0; i < n; i++)
	{
		ans[i][i] = 1;
	}
	for (i = 0; i < n; i++)//第i列
	{
		max = fabs(arcs[i][i]);
		max_num = i;
		for (j = i + 1; j < n; j++)//选出主元
		{
			if (fabs(arcs[j][i]) > max)
			{
				max = fabs(arcs[j][i]);
				max_num = j;
			}
		}
		for (k = 0; k < n; k++)//交换行
		{
			tempA = arcs[i][k];
			arcs[i][k] = arcs[max_num][k];
			arcs[max_num][k] = tempA;
			tempB = ans[i][k];
			ans[i][k] = ans[max_num][k];
			ans[max_num][k] = tempB;
		}
		for (k = i + 1; k < n; k++)
		{
			P = arcs[k][i] / arcs[i][i];
			for (j = 0; j < n; j++)
			{
				arcs[k][j] = arcs[k][j] - arcs[i][j] * P;
				ans[k][j] = ans[k][j] - ans[i][j] * P;
			}
		}
	}
	for (i = 0; i < n; i++)//行
	{
		P = arcs[i][i];
		for (j = i; j < n; j++)
		{
			arcs[i][j] = arcs[i][j] / P;
		}
		for (j = 0; j < n; j++)
		{
			ans[i][j] = ans[i][j] / P;
		}
	}
	for (i = n - 1; i > 0; i--)
	{
		for (j = i - 1; j >= 0; j--)
		{
			for (k = 0; k < n; k++)
			{
				ans[j][k] = ans[j][k] - ans[i][k] * arcs[j][i];
			}
		}
	}
}
int main()
{
	double A[3][3] = { {1,3,3},{2,1,1},{2,3,4} };
	double b[3] = { 1,2,1 };

	Doolittle(A);

	double b1[3][3] = { 0 };
	double b2[3][3] = { 0 };
	Matrix_inverse(U, 3, b1);//求矩阵U的逆
	Matrix_inverse(L, 3, b2);//求矩阵L的逆
	
	
	//x=U^(-1) * L^(-1) * b
	double b3[3][3] = { 0 };
	//U^(-1) * L^(-1)
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; k++)
			{
				b3[i][j] += b1[i][k] * b2[k][j];
			}
		}
	}
	//x=U^(-1) * L^(-1) * b
	double b4[3] = { 0 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			b4[i]+= b3[i][j] * b[j];
		}
	}

	//输出方程的解
	cout << endl;
	for (int i = 0; i < 3; i++)
	{
		cout << "x" << i + 1 << " = " << b4[i] << " ";
	}

	cout << endl << endl << endl;

	return 0;
}

运行结果如下:
在这里插入图片描述

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值