?? 分水系統(tǒng)模型.txt
字號:
#include <stdio.h>
#include <math.h>
#define n 10
FILE *fp1,*fp2;
float min(float a,float b)
{ if(a>b) return b; else return a; }
void eq(float A[],float B[]) //A[i]<--B[i]
{ int i; for(i=0;i<n;i++) A[i]=B[i];}
void uni_eq(float C[],float D[]) //C[i]<--D[i]
{ int i; for(i=0;i<n;i++) C[i]=(-1)*D[i];}
float product(float E[],float L[]) //return E[]*L[]
{ float j=0;int i;
for(i=0;i<n;i++) j=j+E[i]*L[i]; return j; }
void add(float c1,float M[],float c2,float N[],float R[]) //R[]=c1*M[]+c2*N[]
{ int i; for(i=0;i<n;i++) R[i]=c1*M[i]+c2*N[i] ; }
float F(float xc[]) //f(x)
{ return pow(xc[0],2)*pow(xc[1],2)+pow(xc[0],2)+pow(xc[1],2)+pow(xc[2],2)+pow(xc[3],2)+pow(xc[4]-10,2); }
void DF(float G[],float X[]) //G[]=gradient(x[])
{ G[0]=2*X[0]*pow(X[1],2)+2*X[0];G[1]=2*X[1];G[2]=2*X[2];G[3]=2*X[3];G[4]=2*pow((X[4]-10),1); }
void ls(float MX[],float NP[],float RX[]) //RX[]=ls(MX[],NP[])
{ float p=0.1,B=2,v=0.4,a=0,b=1e+8,t=1,f1,f2,g1=0,g2=0,gg[n];
int i,k=0;
f1=F(MX);
DF(gg,MX); g1=product(gg,NP);
for(k=0;k<100;k++)
{ add(1,MX,t,NP,RX); //MX has been changed
f2=F(RX); DF(gg,RX); //g=DF(x)
g2=product(gg,NP);
if(g2<v*g1) { a=t;t=min(0.5*(a+b),2*a);continue;}
else if(f1-f2<(-1)*p*t*g1)
{b=t;t=0.5*(a+b);continue; }
break; }
}
void Add_line(float Line_a[],float Line_b[][n])
{ int i,j;
for(i=0;i<n;i++) Line_a[i]=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
Line_a[i]=Line_a[i]+Line_b[i][j]; } //Line_a[i]為左行X和
void Add_list(float List_a[],float List_b[][n])
{int i,j;
for(j=0;j<n;j++)
{ List_a[j]=0;
for(i=0;i<n;i++)
List_a[j]=List_a[j]+List_b[i][j]; } } //List_a[i]為列X和
float F_min(float F_C[][n],float F_X[][n],float F_A[],float F_B[],float F_mu) //F_min()無約束目標函數(shù) //f(x)
{ int i,j,k;
float f=0,a[n],b[n];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{if(F_X[i][j]>=0) k=0;
else k=1;
f=f+k*pow(F_X[i][j],2); //解決階躍函數(shù),Xij平方和,解決x為正
}
Add_line(a,F_X); //行和a[i]
Add_list(b,F_X); //列和b[i]
for(i=0;i<n;i++) f=f+pow(a[i]-F_A[i],2)+pow(b[i]-F_B[i],2); //f追加等式約束
f=f*F_mu; //引入罰因子F_mu
for(i=0;i<n;i++)
for(j=0;j<n;j++) f=f+F_C[i][j]*F_X[i][j]; //追加原約束問題的目標函數(shù)c*x
return f;
}
main()
{
int i=0,j=0,k,row,colum;
float C[n][n],A[n],B[n],max;
char c;
double t=0,X[n][n];
float a[n],b[n];
FILE *fp1,*fp2;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
X[i][j]=1; // X 被初始化 均為1
fp1=fopen("參數(shù)庫.txt","w+");
fprintf(fp1,"4 2 -3 -1 2 1 0 0 0 0 5\n");
fprintf(fp1,"8 6 -5 -3 6 5 0 1 0 0 12\n");
fprintf(fp1,"4 2 -2 -1 3 2 -1 0 3 1 3\n");
fprintf(fp1,"0 -2 1 5 -1 3 -1 1 9 4 2\n");
fprintf(fp1,"-4 2 6 -1 6 7 -3 3 2 3 3\n");
fprintf(fp1,"8 6 -8 5 7 17 2 6 -3 5 46\n");
fprintf(fp1,"0 2 -1 3 -4 2 5 3 0 1 13\n");
fprintf(fp1,"16 10 -11 -9 17 34 2 -1 2 2 38\n");
fprintf(fp1,"4 6 2 -7 13 9 2 0 12 4 19\n");
fprintf(fp1,"0 0 -1 8 -3 -24 -8 6 3 -1 21\n");
fprintf(fp1,"40 28 26 24 22 20 18 16 14 12\n");//第11行:B[j]
fclose(fp1);
fp1=fopen("參數(shù)庫.txt","r");
for(i=0;i<n;i++)
{ for(j=0;j<n;j++) fscanf(fp1,"%f",&C[i][j]);//輸入C[i][j]
fscanf(fp1,"%f",&A[i]); } //輸入A[i][j]——行和
for(i=0;i<n;i++) fscanf(fp1,"%f",&B[i]); //輸入B[i][j]——列和
fclose(fp1);
fp2=fopen("結(jié)果庫.txt","w+");//輸出文件,格式(規(guī)整)化系數(shù)矩陣
fprintf(fp2,"A====================================A\n");
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
fprintf(fp2,"%5.f\t",C[i][j]);
fprintf(fp2,"%5.f\t",A[i]);
fprintf(fp2,"\n"); }
fprintf(fp2,"\n");
for(i=0;i<n;i++)
fprintf(fp2,"%8.f",B[i]);
fprintf(fp2,"\nA===========A===========A============A\n");
fclose(fp2);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -