谢谢A_Qiao和sayu_yangyou的关心,我VC的水平不高,现在正学着呢,特别希望sayu_yangyou能提供算法,如果有可能的话,最好帮我写成VC的源代码。小弟先谢谢了。
我的E_mail:[email protected]
胡 超
我的E_mail:[email protected]
胡 超
解决方案 »
- 求教一个speech SDK进行中文识别的问题
- 小游戏编程的用书
- 100分!!!!!如何禁止桌面刷新?按F5或者点击右键菜单刷新都可以刷新桌面,怎样禁止这一切?
- 请大虾指教,如何创建文件夹?我写了代码但出错,请帮我找出问题所在!谢谢了!
- 高分求教dll问题!!!
- 不用hook,不用写驱动,怎么截获所有键盘的消息
- 最近极不顺,放分
- 怎样在VC++中改换程序的图标、版权信息等?
- 请问在应用和前途上来说是VC好呢还是C++ BUILDER好?
- WinSocket:什么是“The specified address is not available from the local machine.”
- 关于对话框中绘图的问题
- 无模式对话框的删除???
其实按理说我不应该给你解题的。因为我是一个数学老师,计算方法已经教了4、5遍了,而且学生问问题的时候,只需要给出解题的思路,而不去直接帮学生去把题目做出来。你觉得我应该怎样做呢,你选择吧,是帮你做完,还是给你给你思路。
我的地址:[email protected]
我想把测的实验数据拟合成一个椭圆。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¦
为了方便可以假定左面的矩阵为常量这样问题是怎样写解方程的算法代码。
我想把测的实验数据拟合成一个椭圆。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¦
为了方便可以假定左面的矩阵为常量这样问题是怎样写解方程的算法代码。
#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;
}
再次说声谢谢!