——代码中的各个函数和各个数组维数需要根据不同的情况进行改变才可以使用,这里运用两个例题来测试代码的可行性。
例题一源代码
#include<stdio.h>
void T_(double arr1[2][2],double arr2[2][2])//求矩阵的逆
{
int i;
int j;
int k;
int g;
double arr1tmp[2]={0};
double arr2tmp[2]={0};
int h;
int m;
double tmp;
for(i=0;i<2;i++)
{
arr2[i][i]=1;//化单位矩阵
}
for(i=0;i<2;i++)
{
h=i+1;
while(arr1[i][i]==0)//找调整主元
{
for(j=0;j<2;j++)
{
arr1tmp[j]=arr1[i][j];
arr1[i][j]=arr1[h][j];
arr1[h][j]=arr1tmp[j];
arr2tmp[j]=arr2[i][j];
arr2[i][j]=arr2[h][j];
arr2[h][j]=arr2tmp[j];
}
h++;
}
tmp=arr1[i][i];
for(j=0;j<2;j++)
{
arr1[i][j]=(arr1[i][j]/tmp);
arr2[i][j]=(arr2[i][j]/tmp);
}
for(k=0;k<2;k++)
{
if(k==i)
{
continue;
}
tmp=arr1[k][i];
for(g=0;g<2;g++)
{
arr1[k][g]=(arr1[k][g]-tmp*arr1[i][g]);
arr2[k][g]=(arr2[k][g]-tmp*arr2[i][g]);
}
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
arr1[i][j]=arr2[i][j];
}
}
}
void F(double arr[2],double arr_[2])//F(x)表达式 ,自定义
{
arr_[0]=3*arr[0]*arr[0]-arr[1]*arr[1];
arr_[1]=3*arr[0]*arr[1]*arr[1]-arr[0]*arr[0]*arr[0]-1;
}
void F_(double arr[2],double arr_[2][2]) //自定义
{
arr_[0][0]=6*arr[0];
arr_[0][1]=-2*arr[1];
arr_[1][0]=3*arr[1]*arr[1]-3*arr[0]*arr[0];
arr_[1][1]=6*arr[0]*arr[1];
}
void M(double arr[2],double arra[2][2],double arrb[2])//矩阵运算:迭代结果,F_(x1,x2)逆矩阵,F(x1,x2)
{
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
arr[i]+=arra[i][j]*(-arrb[j]);
}
}
}
int main()
{
double arr0[2][2];
double arr[2];//迭代结果 ,迭代初值
double arr1[2][2];//F_(x1,x2)
double arr2[2];//每次迭代该变量
double arr3[2];//F(x1,x2)
int i;
int count=0;
int maxdd;//最大迭代次数
double jd;//精度
printf("存放初值:\n");
for(i=0;i<2;i++)
{
scanf("%lf",&arr[i]);//存放初值
}
printf("输入精度范围:\n");
scanf("%lf",&jd);
printf("输入最大迭代次数\n");
scanf("%d",&maxdd);
while(1)
{
count++;
F_(arr,arr1);
F(arr,arr3);
T_(arr1,arr0);
M(arr,arr1,arr3);
if((arr3[0]<=jd&&arr3[0]>=(-jd)&&arr3[1]<=jd&&arr3[1]>=(-jd))||count>maxdd)
{
break;
}
}
if(count<=maxdd)
{
printf("迭代次数为:%d\n",count);
printf("迭代结果为:");
for(i=0;i<2;i++)
{
printf("%lf ",arr[i]);
}
printf("\n");
printf("误差为:%lf\n",arr3[0]);
}
else if(count>maxdd)
{
printf("超出最大迭代次数\n");
}
return 0;
}
实验结果
例题二只需要改变例题一代码中的函数即可
例题二源代码
#include<stdio.h>
void T_(double arr1[2][2],double arr2[2][2])//求矩阵的逆
{
int i;
int j;
int k;
int g;
double arr1tmp[2]={0};
double arr2tmp[2]={0};
int h;
int m;
double tmp;
for(i=0;i<2;i++)
{
arr2[i][i]=1;//化单位矩阵
}
for(i=0;i<2;i++)
{
h=i+1;
while(arr1[i][i]==0)//找调整主元
{
for(j=0;j<2;j++)
{
arr1tmp[j]=arr1[i][j];
arr1[i][j]=arr1[h][j];
arr1[h][j]=arr1tmp[j];
arr2tmp[j]=arr2[i][j];
arr2[i][j]=arr2[h][j];
arr2[h][j]=arr2tmp[j];
}
h++;
}
tmp=arr1[i][i];
for(j=0;j<2;j++)
{
arr1[i][j]=(arr1[i][j]/tmp);
arr2[i][j]=(arr2[i][j]/tmp);
}
for(k=0;k<2;k++)
{
if(k==i)
{
continue;
}
tmp=arr1[k][i];
for(g=0;g<2;g++)
{
arr1[k][g]=(arr1[k][g]-tmp*arr1[i][g]);
arr2[k][g]=(arr2[k][g]-tmp*arr2[i][g]);
}
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
arr1[i][j]=arr2[i][j];
}
}
}
void F(double arr[2],double arr_[2])//F(x)表达式 ,自定义
{
arr_[0]=arr[0]*arr[0]+arr[1]*arr[1]-4;
arr_[1]=arr[0]*arr[0]-arr[1]*arr[1]-1;
}
void F_(double arr[2],double arr_[2][2]) //自定义
{
arr_[0][0]=2*arr[0];
arr_[0][1]=2*arr[1];
arr_[1][0]=2*arr[0];
arr_[1][1]=-2*arr[1];
}
void M(double arr[2],double arra[2][2],double arrb[2])//矩阵运算:迭代结果,F_(x1,x2)逆矩阵,F(x1,x2)
{
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
arr[i]+=arra[i][j]*(-arrb[j]);
}
}
}
int main()
{
double arr0[2][2];
double arr[2];//迭代结果 ,迭代初值
double arr1[2][2];//F_(x1,x2)
double arr2[2];//每次迭代该变量
double arr3[2];//F(x1,x2)
int i;
int count=0;
int maxdd;//最大迭代次数
double jd;//精度
printf("存放初值:\n");
for(i=0;i<2;i++)
{
scanf("%lf",&arr[i]);//存放初值
}
printf("输入精度范围:\n");
scanf("%lf",&jd);
printf("输入最大迭代次数\n");
scanf("%d",&maxdd);
while(1)
{
count++;
F_(arr,arr1);
F(arr,arr3);
T_(arr1,arr0);
M(arr,arr1,arr3);
if((arr3[0]<=jd&&arr3[0]>=(-jd)&&arr3[1]<=jd&&arr3[1]>=(-jd))||count>maxdd)
{
break;
}
}
if(count<=maxdd)
{
printf("迭代次数为:%d\n",count);
printf("迭代结果为:");
for(i=0;i<2;i++)
{
printf("%lf ",arr[i]);
}
printf("\n");
printf("误差为:%lf\n",arr3[0]);
}
else if(count>maxdd)
{
printf("超出最大迭代次数\n");
}
return 0;
}
实验结果
——————如有错误,欢迎指正(#^.^#)