线性方程求解器 Arduino,打印错误答案
Linear equation solver Arduino,printing wrong answers
请帮助我任何帮助将不胜感激。
我用 C 写了一个代码来求解方程,但我不知道为什么我输入这个计算器的一些方程给我错误的值,算法是正确的,因为我用 C 执行它并给出正确的答案但是当我在 arduino 上使用它有时不会给我正确的答案,这里是完整的代码
如有任何帮助,我们将不胜感激。
.
.
.
.
.
.
.
long jordan(){/*this do the gauss elimination for solve the equation*/
long FilaMax=0,k=0;
long double maxEl=0,tmp=0,fracc=0;
lcd.clear();
for (colum=0; colum<cant-1; colum++) {
/* search the maximun colum*/
maxEl = abs(a[colum][colum]);
FilaMax = colum;
for (k=colum+1; k<cant; k++) {
if (abs(a[k][colum]) > maxEl) {
maxEl = abs(a[k][colum]);
FilaMax = k;
}
}
/* change the maximunby the actual row*/
for (k=colum; k<cant+1;k++) {
tmp = a[FilaMax][k];
a[FilaMax][k] = a[colum][k];
a[colum][k] = tmp;
}
/*lower cero's triangular matrix it's done here*/
for (k=colum+1;k<cant; k++) {
fracc = -a[k][colum]/a[colum][colum];
for (fila=colum; fila<cant+1; fila++) {
if (colum==fila) {
a[k][fila] = 0;
}else{
a[k][fila] += fracc * a[colum][fila];
}
}
}
}
char sr=' ';
lcd.setCursor(0,0);
if(a[cant-1][cant-1]==0){
lcd.print("No solucion"); /* if there is no solution print this*/
do{
sr=keypad.waitForKey();
}while(sr!='\n');
}else{ /*is there values to print*/
for (colum=cant-1; colum>=0; colum--) {
res[colum] = a[colum][cant]/a[colum][colum];
for (k=colum-1;k>=0;k--) {
a[k][cant] -= a[k][colum]*res[colum];
}
}
colum=0;
do{
lcd.setCursor(0,0);
lcd.print("R");
lcd.setCursor(1,0);
lcd.print(colum+1);
lcd.setCursor(0,1);
lcd.print(res[colum],DEC);
sr=keypad.waitForKey();
if(sr=='#') colum++;
if (colum==cant) colum=0;
if(sr=='\n') break;
}while(1);
}
colum=0;
fila=0;
cant=0;
sr=' ';
return 0;
}
尝试使用以下代码:
input:
# size
4
elements:
1 -2 1 1 2
3 0 2 -2 -8
0 4 -1 -1 1
5 0 3 -1 -3
output:
some numbers
it should print without solution.
我首先 运行 在 pc 上用 c 编写的代码,算法运行完美,但是当我复制到 arduino 时,它在大多数情况下都没有按预期运行,给出了正确的答案线性系统,但有时会失败
任何帮助将不胜感激。
没有太多的评论 - 因为我也有这个错误而四处走动。
使用浮点函数而不是int
// maxEl = abs(a[colum][colum]);
maxEl = fabs(a[colum][colum]);
// other places too
可能存在其他问题。
这是一个浮点错误,您得到的最终值非常接近于零。 Demo.
在最终测试中添加一个小的 epsilon 值以允许浮点数不准确:
if(fabs(a[cant-1][cant-1]) < 0.000001){
lcd.print("No solucion"); /* if there is no solution print this*/
请帮助我任何帮助将不胜感激。 我用 C 写了一个代码来求解方程,但我不知道为什么我输入这个计算器的一些方程给我错误的值,算法是正确的,因为我用 C 执行它并给出正确的答案但是当我在 arduino 上使用它有时不会给我正确的答案,这里是完整的代码
如有任何帮助,我们将不胜感激。
.
.
.
.
.
.
.
long jordan(){/*this do the gauss elimination for solve the equation*/
long FilaMax=0,k=0;
long double maxEl=0,tmp=0,fracc=0;
lcd.clear();
for (colum=0; colum<cant-1; colum++) {
/* search the maximun colum*/
maxEl = abs(a[colum][colum]);
FilaMax = colum;
for (k=colum+1; k<cant; k++) {
if (abs(a[k][colum]) > maxEl) {
maxEl = abs(a[k][colum]);
FilaMax = k;
}
}
/* change the maximunby the actual row*/
for (k=colum; k<cant+1;k++) {
tmp = a[FilaMax][k];
a[FilaMax][k] = a[colum][k];
a[colum][k] = tmp;
}
/*lower cero's triangular matrix it's done here*/
for (k=colum+1;k<cant; k++) {
fracc = -a[k][colum]/a[colum][colum];
for (fila=colum; fila<cant+1; fila++) {
if (colum==fila) {
a[k][fila] = 0;
}else{
a[k][fila] += fracc * a[colum][fila];
}
}
}
}
char sr=' ';
lcd.setCursor(0,0);
if(a[cant-1][cant-1]==0){
lcd.print("No solucion"); /* if there is no solution print this*/
do{
sr=keypad.waitForKey();
}while(sr!='\n');
}else{ /*is there values to print*/
for (colum=cant-1; colum>=0; colum--) {
res[colum] = a[colum][cant]/a[colum][colum];
for (k=colum-1;k>=0;k--) {
a[k][cant] -= a[k][colum]*res[colum];
}
}
colum=0;
do{
lcd.setCursor(0,0);
lcd.print("R");
lcd.setCursor(1,0);
lcd.print(colum+1);
lcd.setCursor(0,1);
lcd.print(res[colum],DEC);
sr=keypad.waitForKey();
if(sr=='#') colum++;
if (colum==cant) colum=0;
if(sr=='\n') break;
}while(1);
}
colum=0;
fila=0;
cant=0;
sr=' ';
return 0;
}
尝试使用以下代码:
input:
# size
4
elements:
1 -2 1 1 2
3 0 2 -2 -8
0 4 -1 -1 1
5 0 3 -1 -3
output:
some numbers
it should print without solution.
我首先 运行 在 pc 上用 c 编写的代码,算法运行完美,但是当我复制到 arduino 时,它在大多数情况下都没有按预期运行,给出了正确的答案线性系统,但有时会失败
任何帮助将不胜感激。
没有太多的评论 - 因为我也有这个错误而四处走动。
使用浮点函数而不是int
// maxEl = abs(a[colum][colum]);
maxEl = fabs(a[colum][colum]);
// other places too
可能存在其他问题。
这是一个浮点错误,您得到的最终值非常接近于零。 Demo.
在最终测试中添加一个小的 epsilon 值以允许浮点数不准确:
if(fabs(a[cant-1][cant-1]) < 0.000001){
lcd.print("No solucion"); /* if there is no solution print this*/