2015-06-12 3 views
2

Пожалуйста, помогите мне, любая помощь будет оценена по достоинству. Я написал код в 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. 

Я первый запуск кода в C на компьютере, и работа алгоритма совершенным, но когда я копирую на Arduino он не работает, как ожидалось большую часть времени дают правильный ответ линейной системе, но иногда не удается

любая помощь будет оценена.

+1

Можете ли вы дать нам пример некорректного выхода, наряду с тем, что правильный вывод должен быть? – baum

+0

вход: # размер: 4, элементы: {1 -2 1 1 2}, {3 0 2 -2 -8}, {0 4 -1 -1 1}, { 5 0 3 -1 -3} вывод: R1 -3.333, R2 3.2, R3 6.33, R4 5.33, но это неправильный ответ, потому что эта система не имеет решения – user2461687

+0

Пожалуйста, можете ли вы помочь Я застрял с этим кодом 2 дня: c – user2461687

ответ

2

Это ошибка с плавающей точкой, конечное значение, которое вы получаете, очень близко к нулю. Demo.

Добавьте небольшое значение эпсилон для финального теста, чтобы с плавающей запятой неточностей:

if(fabs(a[cant-1][cant-1]) < 0.000001){ 
    lcd.print("No solucion"); /* if there is no solution print this*/ 
+0

Я применяю его – user2461687

+0

Спасибо, теперь он заворачивается, как ожидалось: D thaaaanks – user2461687

1

Без особого обзора - выход на конечность, поскольку у меня тоже была эта ошибка.

Использование функции с плавающей точкой может существовать, а не int

// maxEl = abs(a[colum][colum]); 
maxEl = fabs(a[colum][colum]); 
// other places too 

Другие вопросы.

+0

Я делаю изменения для запуска на ардуине, теперь полный код есть, спасибо огромное – user2461687

+0

Я внес изменения, но я получаю результаты:/ – user2461687

+0

@ user2461687 Вы изменили 'abs()' -> 'fabs()' в 3-х местах? – chux

Смежные вопросы