⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 square.cpp

📁 数值计算方法中几个重要的算法用VC++实现
💻 CPP
字号:
/*--解对称正定矩阵方程组的平方根法--*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double *Assign(int n)
{
	return (double*)malloc(sizeof(double)*(n+1));
}
void main()
{
	int i,ik,jk,j,k,n;/*--n是未知数的个数--*/
    double **A,*b,*x,*y,*l,sum;
    printf("Input dimension of Array n(n>=1):\n");
	scanf("%d",&n);
	/*--为数组A,b,x,y,l--*/
    A=(double **)malloc(sizeof(double*)*(n+1));
	for(i=1;i<=n;i++)
		A[i]=Assign(n);
	b=Assign(n);x=Assign(n);y=Assign(n);l=Assign(n);
	/*--对数组A,b进行赋值--*/
	printf("Input the element of Array A:\n");
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			scanf("%lf",&A[i][j]);
	printf("Input the element of Array b:\n");
	for(i=1;i<=n;i++)
		scanf("%lf",&b[i]);
	/*--A=LL(t)--分解计算--*/
	l[1]=sqrt(A[1][1]);
	for(i=2;i<=n;i++)
	{
		jk=i*(i-1)/2+1;
		l[jk]=A[i][1]/l[1];
	}
	/*--对于j=2,3,……,n--*/
	for(j=2;j<=n;j++)
	  {
	  	sum=0;
		for(k=1;k<=j-1;k++)
		{
			jk=j*(j-1)/2+k;
			sum+=pow(l[jk],2);
		}
		l[j*(j-1)/2+j]=sqrt(A[j][j]-sum);
		if(j!=n)
		{
			for(i=j+1;i<=n;i++)
			{
				sum=0;
				for(k=1;k<=j-1;k++)
				{
					ik=i*(i-1)/2+k;
					jk=j*(j-1)/2+k;
					sum+=l[ik]*l[jk];
				}
				l[i*(i-1)/2+j]=(A[i][j]-sum)/l[j*(j-1)/2+j];
			}
		}/*-if-*/
	}/*-for(j)-*/
	/*--求解Ly=b--*/
	y[1]=b[1]/l[1];
	for(i=2;i<=n;i++)
	{
		sum=0;
		for(k=1;k<=i-1;k++)
		{
			ik=i*(i-1)/2+k;
			sum+=l[ik]*y[k];
		}
		y[i]=(b[i]-sum)/l[i*(i-1)/2+i];
	}
	/*--求解L(t)x=y--*/
	x[n]=y[n]/l[n*(n-1)/2+n];
	for(i=n-1;i>=1;i--)
	{
		sum=0;
		for(k=i+1;k<=n;k++)
		{
			jk=k*(k-1)/2+i;
			sum+=l[jk]*x[k];
		}
		x[i]=(y[i]-sum)/l[i*(i-1)/2+i];
	}
	/*-输出x1,x2,x3.....,xn-*/
	for(i=1;i<=n;i++)
		printf("x%d=%.8lf\n",i,x[i]);
	/*--释放空间--*/
    free(l);free(y);free(x);free(b);
	for(i=n;i>=1;i--)
		free(A[i]);
	
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -