c++ - 注释代码时计算值发生变化
问题描述
我在 main 中有这样一部分代码,我在其中调用两个函数来搜索方程组的根。当其中一个被注释掉时,一切都很好。
/*double* res ;
int it;
res = iter(a, y, n,it);
printf("Roots(Iter)\n");
for (int i = 0; i < n; i++) {
printf("x[ %d ]= %lf\n", i, res[i]);
}
printf("\n");
printf("checking(Iter):\n");
for (int i = 0; i < n; i++) {
double sum = 0;
for (int j = 0; j < n; j++) {
sum += a[i][j] * res[j];
}
printf("%lf\n", sum);
}
printf("\n");
printf("Iterations : %d\n", it);*/
double* res_s ;
int it_s;
res_s = seidel(a, y, n,it_s);
printf("Roots(Seidel)\n");
for (int i = 0; i < n; i++) {
printf("x[ %d ]= %lf\n", i, res_s[i]);
}
printf("\n");
printf("checking(Seidel):\n");
for (int i = 0; i < n; i++) {
double sum_s = 0;
for (int j = 0; j < n; j++) {
sum_s += a[i][j] * res_s[j];
}
printf("%lf\n", sum_s);
}
printf("\n");
printf("Iterations : %d\n", it_s);
但是当它们都没有被注释掉时,会发生以下情况:
出于某种原因,迭代次数正在改变。我不明白为什么
!还有一个小问题!
当我删除这一行scanf("%d",&n);
并在 main 中留下一行n=5
时,它也会给出不正确的迭代计数结果..
这是程序的完整代码,如果你能告诉我这个问题是什么,我将非常感激,因为我很困惑:(
double * seidel(double** a, double* y, int n, int& iter_s){
double* res = new double[n];
int i, j;
double sum;
for (i = 0; i < n; i++)
{
res[i] = y[i] / a[i][i];
}
double eps = 0.0001;
double* Xn = new double[n];
do {
iter_s++;
for (i = 0; i < n; i++) {
Xn[i] = y[i] / a[i][i];
for (j = 0; j < i; j++) {
Xn[i] -= a[i][j] / a[i][i] * Xn[j];
}
for (j = i+1; j < n; j++){
Xn[i] -= a[i][j] / a[i][i] * res[j];
}
}
bool flag = true;
for (i = 0; i < n - 1; i++) {
if (fabs(Xn[i] - res[i]) > eps) {
flag = false;
break;
}
}
for (i = 0; i < n; i++) {
res[i] = Xn[i];
}
if (flag)
break;
} while (1);
return res;
}
double* iter(double** a, double* y, int n, int& iter)
{
double* res = new double[n];
int i, j;
double sum;
for (i = 0; i < n; i++)
{
res[i] = y[i] / a[i][i];
}
double eps = 0.0001;
double* Xn = new double[n];
do {
iter++;
for (i = 0; i < n; i++) {
Xn[i] = y[i] / a[i][i];
for (j = 0; j < n; j++) {
if (i == j)
continue;
else {
Xn[i] -= a[i][j] / a[i][i] * res[j];
}
}
}
bool flag = true;
for (i = 0; i < n - 1; i++) {
if (fabs(Xn[i] - res[i]) > eps) {
flag = false;
break;
}
}
for (i = 0; i < n; i++) {
res[i] = Xn[i];
}
if (flag)
break;
} while (1);
return res;
}
double** InvMatr(double** a, int n)
{
double** res;
double* y = new double[n];
double* itr;
int i, j, k;
int it;
res = new double* [n];
for (i = 0; i < n; i++)
{
res[i] = new double[n];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == j)
{
y[j] = 1;
}
else
{
y[j] = 0;
}
}
itr = iter(a, y, n,it);
for (k = 0; k < n; k++)
{
res[k][i] = itr[k];
}
}
return res;
}
double** prodMatr(double** a, double** b, int n)
{
double** res;
double sum=0;
res = new double* [n];
int i, j;
res = new double* [n];
for (i = 0; i < n; i++)
{
res[i] = new double[n];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
res[i][j] = 0;
for (int k = 0; k < n; k++)
res[i][j] += a[i][k] * b[k][j];
}
}
return res;
}
int main()
{
double** a;
double** x;
double** c;
int n, i, j;
scanf("%d",&n);
n=5;
a = new double* [n];
for (i = 0; i < n; i++)
{
a[i] = new double[n];
}
/* a[0][0] = 10; a[0][1] = 3; a[0][2] = 2;
a[1][0] = 3; a[1][1] = 23; a[1][2] = 5;
a[2][0] = 5; a[2][1] = 4; a[2][2] = 35;*/
a[0][0] = 32; a[0][1] = 2; a[0][2] = 1; a[0][3] = 3; a[0][4] = 1;
a[1][0] = 1; a[1][1] = 8; a[1][2] = 3; a[1][3] = 1; a[1][4] = 3;
a[2][0] = 1; a[2][1] = 2; a[2][2] = 16; a[2][3] = 3; a[2][4] = 1;
a[3][0] = 1; a[3][1] = 2; a[3][2] = 3; a[3][3] = 56; a[3][4] = 1;
a[4][0] = 1; a[4][1] = 2; a[4][2] = 1; a[4][3] = 3; a[4][4] = 32;
double y[5] = { 2,3,16,2,5 };
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf(" %.0lf \t",a[i][j]);
}
printf("| %.0lf ", y[i]);
printf("\n");
}
printf("\n");
x = InvMatr(a, n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf(" %lf \t",x[i][j]);
}
printf("\n");
}
printf("\n");
c = prodMatr(a, x, n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf(" %lf \t",c[i][j]);
}
printf("\n");
}
/*double* res ;
int it;
res = iter(a, y, n,it);
printf("Roots(Iter)\n");
for (int i = 0; i < n; i++) {
printf("x[ %d ]= %lf\n", i, res[i]);
}
printf("\n");
printf("checking(Iter):\n");
for (int i = 0; i < n; i++) {
double sum = 0;
for (int j = 0; j < n; j++) {
sum += a[i][j] * res[j];
}
printf("%lf\n", sum);
}
printf("\n");
printf("Iterations : %d\n", it);*/
double* res_s ;
int it_s;
res_s = seidel(a, y, n,it_s);
printf("Roots(Seidel)\n");
for (int i = 0; i < n; i++) {
printf("x[ %d ]= %lf\n", i, res_s[i]);
}
printf("\n");
printf("checking(Seidel):\n");
for (int i = 0; i < n; i++) {
double sum_s = 0;
for (int j = 0; j < n; j++) {
sum_s += a[i][j] * res_s[j];
}
printf("%lf\n", sum_s);
}
printf("\n");
printf("Iterations : %d\n", it_s);
return 0;
}
解决方案
推荐阅读
- python - 使用 find_parent 结果从中获取特定项目
- android - 当我使用 Place Picker 在地图上选择一个点时,地图在启动活动 3 秒后消失
- c# - 有没有办法在控制器生成时在 MVC 中搭建额外的视图?
- python - 获取由 SQLAlchemy 和 psycopg2 执行的所有 SQL 语句的文本表示?
- reactjs - 状态已设置,但 firebase 未注册第一次点击
- jquery - JQuery on load 函数改变加载图像的 CSS 属性
- json - 如何阅读/解析 Firebase 响应 .createUserWithEmailAndPassword
- python - 如何运行多线程刮板
- sql-server - 在 SQL Server 中隐藏数据
- datastax - 如何使用用户定义的函数获取 cassandra 的 blob 列的大小?