저는 C++을 사용하여 라플라스 방정식을 풀고 있습니다. 저는 압력계 인 P를 풀고 있습니다. 내 코드에서, 당신은 아래에서 볼 수 있습니다, P는 x와 y의 함수입니다. 나는 길이 nx와 ny의 2 차원 배열로 선언했다.스택 스매싱이 감지되었습니다. C++. 라플라스 방정식을 푸십시오.
마지막 행렬 결과, P가 올바르다. 내가 "의 printf"를 사용하여이 행렬 P를 인쇄하려고 할 때 숫자가 완벽에 있는데도 그러나, 나는이 같은 오류가있어 :
*** stack smashing detected ***
/bin/bash: line 1: 11738 Aborted
을 아래에 내 프로그램입니다 : 처음에는
#include <cmath>
#include <stdio.h>
const int nx = 5; // number of elements in x-direction
const int ny = 5; // number of elements in x-direction
const int niter = 100; //# of iterations
int main(){
double dx = 2/double((nx-1));
double dy = 1/double((ny-1));
int xmax = 2; int xmin = 0;
int ymax = 1; int ymin = 0;
double p[nx][ny];
double pn[nx][ny];
double x[nx];
double y[ny];
//populate p with zeros
for (int xi = 1; xi <=nx;xi++){
for (int yi = 1;yi<=ny;yi++){
p[xi][yi] = 0;
}
}
//populate x and y
//X
for (int xnum = 1; xnum <=nx; xnum++){
x[1] = 0;
x[xnum+1] = x[xnum] + dx;
}
//Y
for (int ynum = 1; ynum <=ny; ynum++){
y[1] = 0;
y[ynum+1] = y[ynum] + dy;
}
//initial condition
for (int yrange = 1; yrange<=ny;yrange++){
p[nx][yrange] = y[yrange];
}
//SOLVING FOR P
for (int iter = 1; iter<=niter; iter++){
//copy values
for (int xiter= 1; xiter<=nx;xiter++){
for (int yiter = 1; yiter<=ny;yiter++){
pn[xiter][yiter]=p[xiter][yiter];
}
}
//main loop
for (int i = 2; i<=nx-1;i++){
for (int j = 2; j<=ny-1;j++){
p[i][j] = ((pow(dy,2)*(pn[i+1][j]+pn[i-1][j]))+(pow(dx,2)*(p[i][j+1]+pn[i][j-1])))/(2*(pow(dx,2)+pow(dy,2)));
}
}
for (int xrange = 2; xrange<=nx-1;xrange++){
p[xrange][1] = p[xrange][2];
p[xrange][ny] = p[xrange][ny-1];
}
}
//Testing matrix
for (int x = 1; x<=nx;x++){
for (int y =1; y<=ny;y++){
printf("%1.3f\t",p[x][y]);
}
printf("\n");
}
return 0;
}
는, 반복 횟수가 너무 많아서 문제라고 생각했습니다. 즉 niter가 너무 높기 때문에 낮추기로 결정합니다. 여전히 같은 오류가 있습니다. 나 좀 도와 줄 수있어? 행렬 P의 출력 결과가 정확하므로 P를 해결할 때 논리가 아니라고 생각합니다. 어떤 도움도 정말 감사합니다. 감사합니다!
결과를 인쇄 할 수 없을 때 결과가 정확하다는 것을 어떻게 알 수 있습니까? – user463035818
C++ 배열의 원점은 0입니다. 루프의 원점 1을 사용하여 초기화되지 않은 것처럼 보입니다. – user4581301
안녕하세요, 정확한 조건으로 Matlab에서 코딩 된 유사한 프로그램이 있는데, Matlab에서 행렬을 인쇄하고 숫자가 정확하다는 것을 알았습니다. – mle0312