双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

Expression:nptr !=NULL该怎么解决啊?

一直有梦想的咸鱼 一直有梦想的咸鱼 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

#include"mpi.h"
#include"matrix.h"
#include<string.h>
#include<stdlib.h>
#include<math.h> //gcc编译的时候需要加-lm选项

#define THREASHOLD 1e-8
#define ITERATION 20
#define ROW 3 //每个计算节点上的矩阵块有3行4列
#define COL 3
#define LINELEN 5*COL //矩阵文件每一行的长度

int sign(double number) {
if(number<0)
return -1;
else
return 1;
}

int myRank; //计算结点的序号
int procSize; //计算结点的数目
MPI_Status status; //存储状态变量

/*从文件中读取矩阵*/
void readFromFile(double **matrix,int row,int col,char* file){
FILE *fp;
int i,j;
int len=col*10;
char *buf=(char*)calloc(len,sizeof(char));
char *seg=strtok(buf,"\t");
double ele=atof(seg);
if((fp=fopen(file,"r"))==NULL){
perror("fopen");
printf("%s\n",file);
exit(1);
}
for(i=0;i<row;++i){
if(fgets(buf,len,fp)==NULL){
fprintf(stderr,"文件的行数小于矩阵需要的行数\n");
exit(1);
}
matrix[i][0]=ele;
for(j=1;j<col;++j){
if((seg=strtok(NULL,"\t"))==NULL){
fprintf(stderr,"文件的列数小于矩阵需要的列数\n");
exit(1);
}
ele=atof(seg);
matrix[i][j]=ele;
}
memset(buf,0x00,len);
}
free(buf);
fclose(fp);
}

/*把矩阵写入文件*/
void writeToFile(double **matrix,int rows,int columns,char* file){
FILE *fp;
int i,j;
if((fp=fopen(file,"w"))==NULL){
perror("fopen");
exit(1);
}
fprintf(fp,"%d\t%d\n",rows,columns); //文件首行记录矩阵的行数和列数
for(i=0;i<rows;++i){
for(j=0;j<columns;++j){
fprintf(fp,"%-10f\t",matrix[i][j]);
}
fprintf(fp,"\n");
}
fclose(fp);
}

/*把向量写入文件*/
void vectorToFile(double *vector,int len,char* file){
FILE *fp;
int i;
if((fp=fopen(file,"w"))==NULL){
perror("fopen");
exit(1);
}
for(i=0;i<len;++i){
fprintf(fp,"%-10f\t",vector[i]);
}
fclose(fp);
}

/*两个向量进行单边Jacobi正交变换*/
void orthogonalVector(double *Ci,double *Cj,int len1,double *Vi,double *Vj,int len2,int *pass){
double ele=vectorProduct(Ci,Cj,len1);
double ele1=vectorProduct(Ci,Ci,len1);
double ele2=vectorProduct(Cj,Cj,len1);

double tao=(ele1-ele2)/(2*ele);
double tan=sign(tao)/(fabs(tao)+sqrt(1+pow(tao,2)));
double cos=1/sqrt(1+pow(tan,2));
double sin=cos*tan;

int row;
if(fabs(ele)<THREASHOLD)
return; //如果两列已经正交,不需要进行变换,则返回true
*pass=0;

for(row=0;row<len1;++row){
double var1=Ci[row]*cos+Cj[row]*sin;
double var2=Cj[row]*cos-Ci[row]*sin;

Ci[row]=var1;
Cj[row]=var2;

}
for(row=0;row<len2;++row){
double var1=Vi[row]*cos+Vj[row]*sin;
double var2=Vj[row]*cos-Vi[row]*sin;

Vi[row]=var1;
Vj[row]=var2;

}
}

/*矩阵的两列进行单边Jacobi正交变换。V是方阵,行/列数为columns*/
void orthogonal(double **matrix,int rows,int columns,int i,int j,int *pass,double **V){
double* Ci=getColumn(matrix,rows,columns,i);
double* Cj=getColumn(matrix,rows,columns,j);
double* Vi=getColumn(V,columns,columns,i);
double* Vj=getColumn(V,columns,columns,j);
int row;
assert(i<j);

orthogonalVector(Ci,Cj,rows,Vi,Vj,columns,pass);


for(row=0;row<rows;++row){
matrix[row][i]=Ci[row];
matrix[row][j]=Cj[row];
}
for(row=0;row<columns;++row){
V[row][i]=Vi[row];
V[row][j]=Vj[row];
}
free(Ci);
free(Cj);
free(Vi);
free(Vj);
}

void normalize(double **A,int rows,int columns){
double *sigular=(double*)calloc(columns,sizeof(double));
int i,j;
char outFileS[7]={'S','X','.','m','a','t','\0'};
double **U=getMatrix(rows,columns);
char outFileU[7]={'U','X','.','m','a','t','\0'};
for(i=0;i<columns;++i){
double *vector=getColumn(A,rows,columns,i);
double norm=sqrt(vectorProduct(vector,vector,rows));
sigular[i]=norm;
}
outFileS[1]='0'+myRank;
vectorToFile(sigular,columns,outFileS);
for(j=0;j<columns;++j){
if(sigular[j]==0)
for(i=0;i<rows;++i)
U[i][j]=0;
else
for(i=0;i<rows;++i)
U[i][j]=A[i][j]/sigular[j];
}

outFileU[1]='0'+myRank;
writeToFile(U,rows,columns,outFileU);
free(sigular);
freeMatrix(U,rows);
}

void main(int argc, char *argv[])
{
int totalColumn=COL*procSize; //算出原矩阵总共有多少列

/*准备矩阵块A和V*/
char matrixFile[11]={'b','l','o','c','k','X','.','m','a','t','\0'};
double **A=getMatrix(ROW,COL);
double **V=getMatrix(totalColumn,COL);
int j;
int iteration=ITERATION;

char outFileV[7]={'V','X','.','m','a','t','\0'};
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myRank);
MPI_Comm_size(MPI_COMM_WORLD,&procSize);

assert(myRank<10);

matrixFile[5]='0'+myRank;

readFromFile(A,ROW,COL,matrixFile);

for(j=0;j<COL;++j){
V[COL*myRank+j][j]=1.0;
}

/*开始进行单边Jacobi旋转迭代*/

while(iteration-->0){
/*奇数次迭代后矩阵按列范数从大到小排列;偶数次迭代后矩阵按列范数从小到大排列*/
int pass=1;
int allpass=0;
/*每个计算节点上相邻两列进行单边Jacobi变换*/
int i;

for(i=1;i<=totalColumn;++i){ //原矩阵有几列就需要做几轮的交换
int j;
int send=0,recv=0; //send记录是否要把本矩阵块的最后一列发送给下一个计算结点;recv记录是否要从上一个计算结点接收一列数据
int mod1=i%2; //余数为0时是奇序,否则为偶序
int mod2=(myRank*COL)%2; //判断本块的第1列(首列)是否为原矩阵的第奇数列,为0则是,为1则不是
if(mod1^mod2){ //融合了奇序和偶序的情况
j=0; //首列可以和第二列进行正交变换
}
else{
j=1; //首列需要和上一个计算结点的最后一列进行正交变换
if(myRank>0){ //不是第1个计算节点
recv=1; //需要从上一个计算节点接收最后一列
}
}
for(++j;j<COL;j+=2){ //第j列与j-1列进行单边Jacobi正交变换
orthogonal(A,ROW,COL,j-1,j,&pass,V);
exchangeColumn(A,ROW,COL,j-1,j); //正交变换之后交换两列
exchangeColumn(V,totalColumn,COL,j-1,j);
}
if(j==COL){ //最后一列剩下了,无法配对,它需要发送给下一个计算节点
if(myRank<procSize-1){ //如果不是最后1个计算节点
send=1; //需要把最后一列发给下一个计算节点
}
}
if(send){
//把最后一列发给下一个计算节点
double *lastColumnA=getColumn(A,ROW,COL,COL-1);
double *lastColumnV=getColumn(V,totalColumn,COL,COL-1);
MPI_Send(lastColumnA,ROW,MPI_DOUBLE,myRank+1,59,MPI_COMM_WORLD);
MPI_Send(lastColumnV,totalColumn,MPI_DOUBLE,myRank+1,60,MPI_COMM_WORLD);
free(lastColumnA);
free(lastColumnV);
}
if(recv){
//从上一个计算节点接收最后一列
double* preColumnA=(double*)calloc(ROW,sizeof(double));
double* preColumnV=(double*)calloc(totalColumn,sizeof(double));
double* firstColumnA=getColumn(A,ROW,COL,0);
double* firstColumnV=getColumn(V,totalColumn,COL,0);
MPI_Recv(preColumnA,ROW,MPI_DOUBLE,myRank-1,59,MPI_COMM_WORLD,&status);
MPI_Recv(preColumnV,totalColumn,MPI_DOUBLE,myRank-1,60,MPI_COMM_WORLD,&status);
//本行首列与上一个计算节点末列进行正交变换

orthogonalVector(preColumnA,firstColumnA,ROW,preColumnV,firstColumnV,totalColumn,&pass);
//把preColumn留下
setColumn(A,ROW,COL,0,preColumnA);
setColumn(V,totalColumn,COL,0,preColumnV);
//把firstColumn发送给上一个计算结点
MPI_Send(firstColumnA,ROW,MPI_DOUBLE,myRank-1,49,MPI_COMM_WORLD);
MPI_Send(firstColumnV,totalColumn,MPI_DOUBLE,myRank-1,50,MPI_COMM_WORLD);
free(preColumnA);
free(preColumnV);
free(firstColumnA);
free(firstColumnV);
}
if(send){
//把最后一列发给下一个计算节点后,下一个计算节点做完了正交变换,又把一列发送回来了,现在需要接收
double* nextColumnA=(double*)calloc(ROW,sizeof(double));
double* nextColumnV=(double*)calloc(totalColumn,sizeof(double));
MPI_Recv(nextColumnA,ROW,MPI_DOUBLE,myRank+1,49,MPI_COMM_WORLD,&status);
MPI_Recv(nextColumnV,totalColumn,MPI_DOUBLE,myRank+1,50,MPI_COMM_WORLD,&status);
//把接收到的那一列赋给本块的最后一列
setColumn(A,ROW,COL,COL-1,nextColumnA);
setColumn(V,totalColumn,COL,COL-1,nextColumnV);
free(nextColumnA);
free(nextColumnV);
}
}
MPI_Barrier(MPI_COMM_WORLD); //各个计算节点都完成一次迭代后,汇总一上是不是所有的都pass了
MPI_Reduce(&pass,&allpass,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
MPI_Bcast(&allpass,1,MPI_INT,0,MPI_COMM_WORLD); //把是否allpass告知所有节点
if(allpass==procSize)
break; //退出迭代
}
if(myRank==0){
printf("迭代次数:%d\n",ITERATION-iteration-1);
}
outFileV[1]='0'+myRank;
writeToFile(V,totalColumn,COL,outFileV);
normalize(A,ROW,COL);
freeMatrix(A,ROW);
freeMatrix(V,totalColumn);
MPI_Finalize();
}


有没有大虾能帮忙看看啊!!!先谢过了!!!
...全文

相关推荐

具有PWM控制VSC-HVDC链路的IEEE30总线传输系统(Simulink仿真实现)

内容概要:本文构建了一个包含PWM控制VSC-HVDC链路的IEEE30节点电力传输系统,并基于Simulink平台完成了系统的建模仿真。该模型聚焦于高压直流输电(HVDC)技术在区域电网互联中的应用,采用电压源型换流器(VSC)与脉宽调制(PWM)技术实现高效、灵活的电能传输。研究重点在于分析VSC-HVDC链路在复杂多节点电网中对潮流分布、系统稳定性及电能质量的调控能力,特别关注其在区域电网互联、新能源大规模接入以及跨区域电力交换等场景下的动态响应特性与控制性能,为现代智能电网的发展提供技术支撑与仿真验证手段。; 适合人群:具备电力系统、电气工程或自动化等相关专业背景的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于研究VSC-HVDC在多节点电网(如IEEE30节点)中的建模与仿真方法;②分析PWM控制策略下HVDC链路对电网潮流分布、电压稳定性和故障穿越能力的影响;③为区域电网互联、新能源并网及智能电网调度等课题提供仿真基础和技术验证。; 阅读建议:此资源以Simulink仿真实现为核心,建议读者在掌握电力电子技术和电力系统分析基础知识的前提下,结合仿真模型深入理解VSC-HVDC的工作原理与控制策略。在学习过程中,应着重关注模型参数设置、控制环路设计及仿真结果的分析,以达到理论与实践相结合的目的。

woshilaiwade

基于KDE-CDF置信带的不确定综合能源系统鲁棒调度优化研究(Matlab代码实现)

内容概要:本研究针对不确定综合能源系统中的鲁棒调度优化问题,提出一种基于核密度估计-累积分布函数(KDE-CDF)置信带的建模方法,用以精确刻画风能、光伏及负荷等不确定性因素的非正态概率分布特征。通过构建KDE-CDF模型,能够有效捕捉实际运行中新能源出力与负荷需求的波动性与随机性,并在此基础上设计鲁棒优化调度框架,提升系统在不确定性环境下的运行可靠性与经济性。该方法结合Matlab编程实现,综合考虑系统运行成本、峰谷差、碳排放等多重目标,实现多维度协调优化。研究还探讨了与智能优化算法(如粒子群算法)相结合的应用路径,增强了模型的求解效率与工程实用性,为含多种储能装置、电转气设备及碳捕集系统的复杂综合能源系统提供了科学的调度决策支持。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员,以及从事综合能源系统规划、运行与调度工作的工程技术人员。; 使用场景及目标:①解决高比例可再生能源接入背景下综合能源系统调度中的不确定性建模难题;②提升调度方案在面对新能源强波动性时的鲁棒性与适应能力;③为融合多类型灵活性资源(如储能、电转气、碳捕集)的综合能源系统提供精细化、可落地的优化运行策略。; 阅读建议:建议读者在掌握概率统计、随机优化与电力系统运行基础知识的前提下,结合文中提供的Matlab代码进行实践操作,重点关注KDE-CDF置信带的构建流程及其在鲁棒优化模型中的嵌入机制,通过调整输入数据分布、参数设置与场景配置开展仿真对比实验,深入理解不确定性建模精度对调度决策质量的影响,进而掌握从数据驱动角度提升系统鲁棒性的关键技术路径。

抬头望远方

chrome-headless-shell-mac-x64-160.0.8160.0(Canary).zip

内容概要:Chrome for Testing 官方 chrome-headless-shell 160.0.8160.0 x64 平台(金丝雀版通道),原版未修改,附来源说明。 适合人群:x64 上的自动化测试工程师、爬虫开发者、CI 环境搭建者。 使用场景及目标:①无头浏览器(Playwright/Puppeteer/Selenium 无界面自动化与爬虫的运行内核);②服务器/容器离线内置;③版本精准匹配(chromedriver 与 Chrome 需同大版本)。 其他说明:Chrome for Testing 为 Google 官方发布、允许自由分发的文件;本资源为第三方整理的下载便利服务。

LCG元

多智能体-系统-形成-控制 附matlab代码.rar

多智能体-系统-形成-控制 附matlab代码.rar

天天Matlab科研工作室

含分布式电源的配电网可靠性评估研究(Matlab代码实现)

内容概要:本文系统研究了含分布式电源的配电网可靠性评估方法,基于Matlab代码实现了完整的评估模型与算法框架。研究深入分析了分布式电源接入后对配电网结构与运行特性的影响,重点探讨了其对供电可靠性的作用机制。采用序贯蒙特卡洛模拟法对系统各类状态进行抽样与仿真,综合考虑了分布式电源出力的随机性、负荷波动性以及网络拓扑变化等多种不确定性因素,精确计算了系统及负荷点的多项可靠性指标。通过在标准测试系统上的仿真实验,验证了所提方法的有效性和实用性,为新型电力系统环境下配电网的规划、运行与可靠性提升提供了有力的技术支撑和决策依据。; 适合人群:具备电力系统分析、概率统计及可靠性基础理论知识,熟悉Matlab编程语言,从事电力系统规划、运行、可靠性评估等相关工作的科研人员、高校研究生以及电力行业工程师。; 使用场景及目标:①掌握含分布式电源的现代配电网可靠性评估的核心理论与关键技术;②学习并实践基于序贯蒙特卡洛模拟的电力系统可靠性分析算法的Matlab实现方法;③为实际工程中分布式电源的优化配置、配电网的升级改造以及制定可靠性提升策略提供科学的仿真工具和量化分析依据。; 阅读建议:建议读者结合文中提供的Matlab代码,逐行阅读并运行程序,重点理解系统建模、状态抽样、潮流计算与指标统计等核心模块的实现逻辑。可尝试调整分布式电源的类型、容量、接入位置及负荷水平等参数,观察其对系统可靠性指标的影响趋势,从而深化对系统动态行为与关键影响因素的理解。

@橘柑橙柠桔柚
评论 3
收藏 已收藏
分享
返回顶部
一直有梦想的咸鱼
C语言 70,039 成员 243,237 内容