谢谢A_Qiao和sayu_yangyou的关心,我VC的水平不高,现在正学着呢,特别希望sayu_yangyou能提供算法,如果有可能的话,最好帮我写成VC的源代码。小弟先谢谢了。
我的E_mail:[email protected]
          
 胡  超  

解决方案 »

  1.   

    你能不能够把题目发给我。你的题目让我不太清楚。
    其实按理说我不应该给你解题的。因为我是一个数学老师,计算方法已经教了4、5遍了,而且学生问问题的时候,只需要给出解题的思路,而不去直接帮学生去把题目做出来。你觉得我应该怎样做呢,你选择吧,是帮你做完,还是给你给你思路。
    我的地址:[email protected]
      

  2.   

    谢谢sayu_yangyou的热情关心、帮助。题目是这样的:
    我想把测的实验数据拟合成一个椭圆。36个数值理论上应该在一个椭圆上,由于实验误差,所以不在一个椭圆上,必须拟合(调整误差)
    设椭圆方程为
    ax^2+2bxy+cy^2+2dx+2ey=1.
    所以
    (xi^2,2xiyi,yi^2,2xi,2yi) . (a,b,c,d,e)=1
    设36个点的向量(xi^2,2xiyi,yi^2,2xi,2yi,1)可以构成一个距阵A
    则组成的方程组是:A[36][5]*[a,b,c,d,e]=[1,1,...1] 
    要求出向量[a,b,c,d,e]? 
    ¦ x1^2    2x1y1    y1^2  2x1  2y1    ¦  ¦a¦  = ¦1¦ 
    ¦ x2^2    2x2y1    y2^2  2x2  2y2    ¦  ¦b¦  = ¦1¦ 
    ¦ x3^2    2x3y1    y3^2  2x3  2y3    ¦  ¦c¦  = ¦1¦ 
    ¦ x4^2    2x4y1    y4^2  2x4  2y4    ¦* ¦d¦  = ¦1¦ 
    ¦  .        .        .    .    .     ¦  ¦e¦  =  .        
    ¦  .        .        .    .    .     ¦       =  . 
    ¦  .        .        .    .    .     ¦       =  . 
    ¦ x36^2  2x36y36  y36^2  2x36 2y36   ¦       = ¦1¦
    为了方便可以假定左面的矩阵为常量这样问题是怎样写解方程的算法代码。
      

  3.   

    谢谢sayu_yangyou的热情关心、帮助。题目是这样的:
    我想把测的实验数据拟合成一个椭圆。36个数值理论上应该在一个椭圆上,由于实验误差,所以不在一个椭圆上,必须拟合(调整误差)
    设椭圆方程为
    ax^2+2bxy+cy^2+2dx+2ey=1.
    所以
    (xi^2,2xiyi,yi^2,2xi,2yi) . (a,b,c,d,e)=1
    设36个点的向量(xi^2,2xiyi,yi^2,2xi,2yi,1)可以构成一个距阵A
    则组成的方程组是:A[36][5]*[a,b,c,d,e]=[1,1,...1] 
    要求出向量[a,b,c,d,e]?
    ¦ x1^2    2x1y1    y1^2  2x1  2y1    ¦  ¦a¦  = ¦1¦ 
    ¦ x2^2    2x2y1    y2^2  2x2  2y2    ¦  ¦b¦  = ¦1¦ 
    ¦ x3^2    2x3y1    y3^2  2x3  2y3    ¦  ¦c¦  = ¦1¦ 
    ¦ x4^2    2x4y1    y4^2  2x4  2y4    ¦* ¦d¦  = ¦1¦ 
    ¦  .        .        .    .    .      ¦  ¦e¦  =  .        
    ¦  .        .        .    .    .      ¦      =  . 
    ¦  .        .        .    .    .      ¦      =  . 
    ¦ x36^2  2x36y36  y36^2  2x36 2y36    ¦      = ¦1¦ 
    为了方便可以假定左面的矩阵为常量这样问题是怎样写解方程的算法代码。
      

  4.   

    注意,这个程序只能解决你的问题,不是一个通用的程序。我已经编译并且实现过了,你可以拿去试一试。有问题再和我联系。另外,你给我发的信全是乱码,所以我把它删除了。现在只能在这里把程序贴在这里。
    #include <iostream.h>
    #include <math.h>
    void main(){
    float A[36][5];//实验数据的系数矩阵
    float x[5];//未知数矩阵,最后的解就放在这里
    float b[36];//等式右边的全部为1的向量
    float parA[5][5],parb[5];//最后用来计算的矩阵
    int i,j,k;
    int label;
    float mid=0;
    //在这里你需要做的是初始化的工作,对A矩阵进行初始化,下面用的A矩阵是已经赋值过的了,
    //同样b向量也是初始化为1的向量,x向量初始化为0
    //下面对parA矩阵进行初始化赋值
    for (i=0;i<5;i++){
    mid=0;
    for (j=0;j<36;j++) mid+=A[j][i]*2*b[j];
    parb[i]=mid;
    for (j=0;j<5;j++){
    mid=0;
    for (k=0;k<36;k++){
    mid+=A[k][i]*A[k][j]*2;
    }
    parA[i][j]=mid;
    }
    }
    //对par和b组成的增广矩阵进行列主元消去法求解。
    for (i=0;i<4;i++){
    mid=fabs(parA[i][i]);
    label=i;
    //下面找列主元
    for (k=i+1;k<5;k++){
    if (fabs(parA[k][i])>mid){
    label=k;
    mid=fabs(parA[k][i]);
    }
    }
    //判断矩阵的秩
    if (mid<=0.000001){
    cout<<"由于系数矩阵的秩小于行数,不能进行方程组的求解。\n";
    return;
    }
    //交换主元
    if (label!=i){
    cout<<"change\n";
    for (j=0;j<5;j++){
    mid=parA[i][j];
    parA[i][j]=parA[label][j];
    parA[label][j]=mid;
    }
    mid=parb[i];
    parb[i]=parb[label];
    parb[label]=mid;
    }
    //开始消元
    //标准化第i行
    parb[i]=parb[i]/parA[i][i];
    for (j=4;j>=0;j--){
    parA[i][j]=parA[i][j]/parA[i][i];
    }
    //消b
    for (j=i+1;j<5;j++) parb[j]=parb[j]-parb[i]*parA[j][i];
    //消par
    for (j=i+1;j<5;j++){
    for (k=5;k>i;k--){
    parA[j][k]=parA[j][k]-parA[i][k]*parA[j][i];
    }
    }
    //列主元消元完成
    }
    //下面回代求解
    for (i=4;i>=0;i--){
    mid=0;
    for (j=4;j>i;j--) mid+=parA[i][j]*x[j];
    x[i]=(parb[i]-mid)/parA[i][i];
    }
    //输出结果
    for (i=0;i<5;i++) cout<<x[i]<<endl;
    }
      

  5.   

    非常感谢 sayu_yangyou(萨虞.扬尤)热心帮助,学生无法用语言来表达,如果有空一定要来徐州玩!
    再次说声谢谢!