gpt4 book ai didi

c - 为什么下面的代码会出现内存不足的情况?

转载 作者:行者123 更新时间:2023-11-30 16:57:39 27 4
gpt4 key购买 nike

以下代码描述了 2 个谐振子。它们最初是解耦且独立的,我只关注其中之一,即机械振荡器。另一个振荡器的变量已被声明并强制为 0。我首先进行 300,000 次迭代,并对 80 个不同频率的 wdm(机械驱动 w)执行此操作。

//find frequency response
int index_A;
double wdm_1;
wdm_1=wm-2*3.142*2e5;
double wdm_2;
wdm_2=wm+2*3.142*2e5;
double wdm_prec=2*3.142*5e3;
index_A=(wdm_2-wdm_1)/wdm_prec;
printf("%d \n", index_A);

However, my code runs till 58 frequencies and gives this error:

奇怪的是,如果我以 2 个部分(每部分 40 个频率)运行代码并将文件附加在一起,它就可以正常工作。

Resonance peak in frequency domain

此外,当我将 v0 的大小减少到 3 时,代码可以正常工作。但是,稍后我将需要其他变量。

int j=0;
for (j=0; j<= index_A ; j++){
wdm=wdm_1+j*wdm_prec;
printf("%d \n",j);
v0[0] = 0;
v0[1] = 0;
v0[2] = 0;
v0[3] = 0;
v0[4] = 0;
v0[5] = 0;
v0[6]= wdm;

for (i=0; i< n ; i++){
if (cabs(xa)>=1){
printf("Breaking Loop \n");
break;
}

v1 = rk4vec_ameya_complex_1 ( tau, 7, v0, dtau, rk4vec_f_ameya_complex_1 );
memcpy(v0, v1, 4 * sizeof ( double complex ) );
tau=tau+dtau;
}

fprintf(f1, "%g, %g \n", wdm/(2*3.142), cabs(v1[2]) );
}
printf("Completed");
fclose(f1);

在时间迭代结束时,我将频率 wdm 的值和位移 x=v1[2] 的最后值保存在文件中,然后继续使用另一个频率进行时间迭代。因此,我的文件包含频率响应。

fprintf(f1, "%g, %g \n", wdm/(2*3.142), cabs(v1[2]) );

我使用了 people.sc.fsu.edu/~jburkardt/c_src/rk4/rk4.html 中的 runge kutta (rk4.c),并使用它修改了复杂数据类型

#include <complex.h>

以下是runge-kutta-4要解决的函数:

/******************************************************************************/

double complex *rk4vec_f_ameya_complex_1 ( double t, int n, double complex u[] )

/******************************************************************************/

{
double complex drive_m;
double complex drive_c;
double x;
double xrf0_1;
double complex *uprime;
uprime = ( double * ) malloc ( 7 * sizeof ( double complex ) );

//Check if memory unavailable
if(uprime==NULL){
printf("No memory available \n");
return 0;
}

///////////////////Second Order////////////////////////
xrf0_1=xrf0*(1-exp(-0.2*t));
drive_m=(xrf0*cexp(I*((u[6]-wm)/gammac)*t)/(2*wm*gammac));
uprime[2]=u[3];
uprime[3]=(wm/gammac)*(drive_m-u[3]*(2*I+2*gammam/wm)-u[2]*(2*I*gammam/gammac));

return uprime;
free(uprime);
}

如果我使用 malloc() 导致内存不足,请提出任何解决方案。

最佳答案

一个明显的问题 - 从 rk4vec_f_ameya_complex_1 返回后释放 uprime,我预计您会收到无法访问的代码警告。另外,由于 upprime 的大小始终相同,为什么要使用 malloc 呢?如果您只是将其设置为大小为 7 的数组,那么您不会遇到 malloc 问题,并且您的代码可能会运行得更快。

关于c - 为什么下面的代码会出现内存不足的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39426769/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com