ailing 发表于 2008-9-3 16:32

求助,一个c++程序

#include<iostream>
#include<iomanip>
using namespace std;
const float h=0.01; //步长
const float Tmax=10;//最大时间
void gauss(float arr[][3],int n);
int main(){
        //变量说明
    float I3[1001],U3[1001],I5[1001],U5[1001];
        float YN[2][3];//结点方程的增广阵
        float t; //时间变量
        int m=2;//阶数
        float Gl,Gc;
        int k;
        //输入电路参数
        float Is=1,R2=20,R4=2,L=2,C=0.2;
        //计算Gl,Gc
        Gl=h/(2*L);
        Gc=2*C/h;
        //初始值计算
        I3[0]=0;U5[0]=1;
        I5[0]=(-1-R2)/(R2+R4);
        U3[0]=(1-I5[0])*R2;
        t=0.01;k=0;
        while(t<=Tmax){
        //增广阵
            YN[0][0]=1/R2+1/R4+Gl;
             YN[0][1]=-1/R4;
            YN[1][0]=-1/R4;
            YN[1][1]=1/R4+Gc;
            
            YN[0][2]=Is-I3[k]-Gl*U3[k];
            YN[1][2]=I5[k]+Gc*U5[k];
                //调用gauss函数,解方程
                  gauss(YN,m);
                U3[k+1]=YN[0][2];
                U5[k+1]=YN[1][2];
                //计算下一次初值
                I3[k+1]=Gl*U3[k+1]+I3[k]+Gl*U3[k];
                I5[k+1]=Gc*(U5[k+1]-U5[k])-I5[k];
                //时间变量增加一个步长,k加1
                t=t+h;
                k++;
        }
        //每隔20个时间点输出
        cout<<"T(s)"<<setw(15)<<"IL3(A)"<<setw(15)<<"UC5(V)"<<endl;
        for(k=0;k<=1000;k++){
                if(k%20==0){
                        cout<<k*h<<setw(15)<<I3[k]<<setw(15)<<U5[k]<<endl;
                }
        }
    return 0;
}
//gaus function
void gauss(float arr[][3],int n){
        int m;
        m=n+1;
        int i,j,k;
       
        //消元
        float a;
        for(k=0;k<=n-2;k++){
                for(i=k+1;i<=n-1;i++){
                  a=arr[i][k]/arr[k][k];
                    for(j=0;j<=n;j++){
                           arr[i][j]=arr[i][j]-a*arr[k][j];
                        }
                }
        }
        //回代求解
        arr[n-1][n]=arr[n-1][n]/arr[n-1][n-1];
        for(j=n-1;j>=1;j--){
                for(i=j-1;i>=0;i--){
                arr[i][n]=arr[i][n]-arr[i][j]*arr[j][n];
                }
                arr[j-1][n]=arr[j-1][n]/arr[j-1][j-1];
        }
}
这是一个解电路计算的程序,计算最后一次值U3[1000],U5[1000]时,结果不对,不知道怎么回事,请大侠帮忙看看


页: [1]

编程论坛