IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Уравнивани реакции.проблема с чтением данных, С++
сообщение
Сообщение #21


Гость






Скорее всего, твоя система имеет не единственное решение (или не имеет решения вообще), в таком случае надо смотреть в сторону вот этого метода, например: Поиск фундаментальной системы решений с минимизацией невязки
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


а если система имеет решение, но при этом нужно взять какую-то неизвестную свободной?
то есть установить значение,в зависимости от которого всё считается...


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

Репутация: -  0  +


извините....пожалуйста! помогите сделать,чтобы этот код работал с моими матрицами...
у меня никак не получается=((
заранее спасибо!
Код
static const int maxsvditerations = 30;
double extsign(double a, double b);
double mymax(double a, double b);
double pythag(double a, double b);

void svdsolvefundamental([b]ap::real_2d_array a[/b],
     int m,
     int n,
    [b] ap::real_2d_array& solutions[/b],
     int& dimension)
{
    int nm;
    int minmn;

     ////........

    ap::real_1d_array rv1;
    ap::real_1d_array w;
    ap::real_2d_array v;
    bool flag;
    double epsilon;

    rv1.setbounds(1, n);
    w.setbounds(1, n);
    v.setbounds(1, n, 1, n);
    if( m<n )
    {
        minmn = m;
    }
    else
    {
        minmn = n;
    }
    g = 0.0;
    vscale = 0.0;
    anorm = 0.0;
    for(i = 1; i <= n; i++)
    {
        l = i+1;
        rv1(i) = vscale*g;
        g = 0;
        s = 0;
        vscale = 0;
        if( i<=m )
        {
            for(k = i; k <= m; k++)
            {
                vscale = vscale+fabs(a(k,i));
            }


      /// .....



    epsilon = epsilon*n*ap::machineepsilon;
    dimension = 0;
    for(i = 1; i <= n; i++)
    {
        if( fabs(w(i))<=epsilon )
        {
            dimension = dimension+1;
        }
    }
    solutions.setbounds(1, n, 0, dimension);
    for(i = 1; i <= n; i++)
    {
        solutions(i,0) = 0;
        for(j = 1; j <= m; j++)
        {
            solutions(i,0) = solutions(i,0)+a(j,i)*a(j,n+1);
        }
    }
    k = 1;
    for(j = 1; j <= n; j++)
    {
        if( fabs(w(j))>epsilon )
        {
            for(i = 1; i <= n; i++)
            {
                v(i,j) = v(i,j)/w(j);
            }
        }
        else
        {
            for(i = 1; i <= n; i++)
            {
                solutions(i,k) = v(i,j);
            }
            k = k+1;
        }
    }
    for(i = 1; i <= n; i++)
    {
        a(1,i) = 0;
        for(j = 1; j <= n; j++)
        {
            if( fabs(w(j))>epsilon )
            {
                a(1,i) = a(1,i)+v(i,j)*solutions(j,0);
            }
        }
    }
    for(i = 1; i <= n; i++)
    {
        solutions(i,0) = a(1,i);
    }
}


вот файлы этого алгоритма
Прикрепленный файл  ap.rar ( 4.59 килобайт ) Кол-во скачиваний: 300

Прикрепленный файл  svdsolveunit.rar ( 3.48 килобайт ) Кол-во скачиваний: 292


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Гость






По-моему, было бы проще добавить в код пару строк, конвертирующих массив index в объект типа ap::real_2d_array. Если брать за основу то, что я привел в посте №13, то достаточно добавить после заполнения StringGrid-а вот это:

  ap::real_2d_array arr;
arr.setbounds(1, curr_line, 1, 8);
for (int i = 1; i <= curr_line; i++) {
for(int j = 1; j <= 7; j++) {
arr(i, j) = index[i - 1][j - 1];
}
arr(i, 8) = 0;
}
int dimension;
ap::real_2d_array solution;
svdsolvefundamental(arr, curr_line, 7, solution, dimension);
Memo1->Lines->Add("Solution:");
for(int j = 1; j <= 7; j++)
Memo1->Lines->Add(FloatToStr(solution(j, 0)));

, и в мемо будет записано частное решение системы. Ну, и базис выводится аналогично...

Только все-же что-то с системой не так... Получается нулевое решение, хотя тестовые примеры показывают работоспособность svdsolvefundamental...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Гость






вот например для уравнивания
KMnO_4+KNO_2+H_2SO_4-->MnSO_4+KNO_3+K_2SO_4+H_2O
при нахождении коэффициентов из линейных уравнений,
нужно положить одному из коэфф-тов значение.
может использовать ненулевую правую часть?
не знаю что делать=((

p.s. ответить со своего аккаунта не могу.ошибка в форуме.
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.04.2024 15:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name