Прога на Delphi.C++ или Pascal

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Rastamanka, 1 Feb 2009.

  1. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Прога на Delphi,C++ или Pascal

    В общем ищу софт с исходниками на данных языках.
    Тема софта:
    1.Решение нелинейных уравнений методом итерации
    2.Решение простых линейных уравнений методом итерации
     
    #1 Rastamanka, 1 Feb 2009
    Last edited: 1 Feb 2009
  2. blednii

    blednii Elder - Старейшина

    Joined:
    12 Jun 2007
    Messages:
    160
    Likes Received:
    23
    Reputations:
    -7
    Тебе надо чтоб решение выводил или только твет?
     
  3. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Только ответ.
     
    1 person likes this.
  4. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Решение системы линейных алгебраических уравнений ( СЛАУ ) методом простых итераций (методом Якоби).

    Исходный код.

    PHP:
    #include "stdio.h"
    #include "iostream.h"
    #include "math.h"

    // приведение матрицы коэффициентов к виду с ненулевой диагональю и соответствующее изменение вектора правых частей
    // возвращает true - если приведение - успешно
    bool getDiagonaldouble **coefficientsdouble *rightPartint currColumnint numberOfEquation ) {
        
    bool result false;
        
    int irow currColumn;
        
    double tempItem;

        
    // для матрицы 1x1 ответом является ненулевость ее единственного элемента
        
    if ( currColumn == numberOfEquation ) {
            
    result coefficients[currColumn][currColumn] != 0;
        }
        else {
            
    // пока не найдена перестановка приводящая матрицу к виду с ненулевой диагональю и пока мы можем еще просматривать строки ищем перестановку
            
    while ( !result && row numberOfEquation ) {
                
    // если текущий элемент на диагонали нулевой ищем в столбце дальше ненулевой
                
    if ( coefficients[row][currColumn] != ) {
                    
    // если элемент ненулевой и не лежит на диагонали меняем местами сотвествующие строки в матрице и элементы в векторе прваых частей
                    
    if ( row != currColumn ) {
                        for ( 
    0numberOfEquationi++ ) {
                            
    tempItem coefficients[currColumn][i];
                            
    coefficients[currColumn][i] = coefficients[row][i];
                            
    coefficients[row][i] = tempItem;
                        }                
                        
    tempItem rightPart[currColumn];
                        
    rightPart[currColumn] = rightPart[row];
                        
    rightPart[row] = tempItem;                    
                    }
                    
    // рекурсивный вызов фактически для подматрицы с размерностью на 1 меньше
                    
    result getDiagonalcoefficientsrightPartcurrColumn 1numberOfEquation );
                    if ( 
    result ) {
                        break;
                    }
                }
                
    row ++;
            }
        }

        return 
    result;
    }

    // было ли найдено решение, если да - итог в параметре solution
    int iterationdouble **coefficientsdouble *rightPartint numberOfEquationdouble *solutiondouble precision ) {
        
    bool result;
        
    int ijkstep 1;
        
    double temp;
        
    doubletempSolution;

        
    tempSolution = new double[numberOfEquation];
        
        
    // приведение матрицы коэффициентов к виду с ненулевой диагональю и соответствующее изменение вектора правых частей
        
    result getDiagonalcoefficientsrightPart0numberOfEquation );    

        
    // если приведение успешно - работаем дальше
        
    if ( result ) {
            
    double fault precision 1;

            
    // преобразуем матрицу и правую часть для дальнейшего решения
            
    for ( 0numberOfEquation++ ) {
                for ( 
    0numberOfEquation++ ) {
                    if ( 
    != ) {
                        
    coefficients[i][j] = - coefficients[i][j] / coefficients[i][i];
                    }
                }
                
    rightPart[i] = rightPart[i] / coefficients[i][i];
                
    coefficients[i][i] = 0;
            }

            
    // первое приближение решения - преобразованный вектор правых частей
            
    for ( 0numberOfEquation++ ) {
                
    solution[i] = rightPart[i];
            }

            
    // пока не найдено решение с допустимй погрешнстью или пока не исчерпан лимит шагов... если все расходится например
            
    while ( fault precision && step <= 1000 ) {

                
    // поиск новой итерации с ее "самоиспользованием" при расчетах            
                
    for ( 0numberOfEquation++ ) {
                    
    tempSolution[j] = 0;
                }
                for ( 
    0numberOfEquation++ ) {
                    for ( 
    0numberOfEquation++ ) {
                        
    tempSolution[i] = tempSolution[i] + coefficients[i][j] * solution[j]; 
                    }
                    
    tempSolution[i] = tempSolution[i] + rightPart[i];
                }

                
    // расчет погрешности
                
    fault 0.0;
                for ( 
    0numberOfEquation++ ) {
                    
    fault fault + (solution[j] - tempSolution[j])*(solution[j] - tempSolution[j]);
                }
                
    fault sqrtfault );

                
    // сохранение полученной новой итерации
                
    for ( 0numberOfEquation++ ) {
                    
    solution[j] = tempSolution[j];
                }
                
    step++;
            }
        }
        else {
            
    result 1001;
        }
        

        return 
    step;
    }


    void main() {
        
    int ij;
        
    int size;
        
    double **coefficients, *rightPart, *solutionprecision;

        
    cout << "Simple iteration method.\nEnter system dimension: ";
        
    cin >> size;

        
    coefficients = new double*[size];
        for ( 
    0sizei++ ) {
            
    coefficients[i] = new double[size];
        }
        
    rightPart = new double[size];
        
    solution = new double[size];

        for ( 
    0size++ ){
            
    cout << "Enter " << << " row: ";
            for ( 
    0size++ ){
                
    cin >> coefficients[i][j];
            }
        }

        
    cout << "Enter right part: ";
        for ( 
    0size++ ){
            
    cin >> rightPart[j];
        }

        
    cout << "Enter precision: ";
            
    cin >> precision;

        
    int steps iterationcoefficientsrightPartsizesolutionprecision );
        if ( 
    steps 1000 ) {
            
    cout << "Solution for this matrix of coefficients not exist or not found";
        }
        else {
            
    cout << "Solution is:\n";
            for ( 
    0size++ ){
                
    cout << solution[j] << "\n";
            }
            
    cout << "Number of step: " << steps;
        }

        
    cout << "\nPress \"Enter\" to continue..." << endl
        
    getchar();    
    }

    Примеры использования (распечатка листинга):


     
    #4 Flame of Soul, 4 Feb 2009
    Last edited: 4 Feb 2009
    1 person likes this.
  5. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Метод простых итераций довольно медленно сходится. Для его ускорения существует метод Зейделя


    Исходный код:

    PHP:
    #include "stdio.h"
    #include "iostream.h"
    #include "math.h"

    // приведение матрицы коэффициентов к виду с ненулевой диагональю и соответствующее изменение вектора правых частей
    // возвращает true - если приведение - успешно
    bool getDiagonaldouble **coefficientsdouble *rightPartint currColumnint numberOfEquation ) {
        
    bool result false;
        
    int irow currColumn;
        
    double tempItem;

        
    // для матрицы 1x1 ответом является ненулевость ее единственного элемента
        
    if ( currColumn == numberOfEquation ) {
            
    result coefficients[currColumn][currColumn] != 0;
        }
        else {
            
    // пока не найдена перестановка приводящая матрицу к виду с ненулевой диагональю и пока мы можем еще просматривать строки ищем перестановку
            
    while ( !result && row numberOfEquation ) {
                
    // если текущий элемент на диагонали нулевой ищем в столбце дальше ненулевой
                
    if ( coefficients[row][currColumn] != ) {
                    
    // если элемент ненулевой и не лежит на диагонали меняем местами сотвествующие строки в матрице и элементы в векторе прваых частей
                    
    if ( row != currColumn ) {
                        for ( 
    0numberOfEquationi++ ) {
                            
    tempItem coefficients[currColumn][i];
                            
    coefficients[currColumn][i] = coefficients[row][i];
                            
    coefficients[row][i] = tempItem;
                        }                
                        
    tempItem rightPart[currColumn];
                        
    rightPart[currColumn] = rightPart[row];
                        
    rightPart[row] = tempItem;                    
                    }
                    
    // рекурсивный вызов фактически для подматрицы с размерностью на 1 меньше
                    
    result getDiagonalcoefficientsrightPartcurrColumn 1numberOfEquation );
                    if (
    result) {
                        break;
                    }
                }
                
    row ++;
            }
        }

        return 
    result;
    }

    // было ли найдено решение, если да - итог в параметре solution
    int iterationdouble **coefficientsdouble *rightPartint numberOfEquationdouble *solutiondouble precision ) {
        
    bool result;
        
    int ijkstep 1;
        
    double temp;
        
    doubletempSolution;

        
    tempSolution = new double[numberOfEquation];
        
        
    // приведение матрицы коэффициентов к виду с ненулевой диагональю и соответствующее изменение вектора правых частей
        
    result getDiagonalcoefficientsrightPart0numberOfEquation );    

        
    // если приведение успешно - работаем дальше
        
    if ( result ) {
            
    double fault precision 1;

            
    // преобразуем матрицу и правую часть для дальнейшего решения
            
    for ( 0numberOfEquation++ ) {
                for ( 
    0numberOfEquation++ ) {
                    if ( 
    != ) {
                        
    coefficients[i][j] = - coefficients[i][j] / coefficients[i][i];
                    }
                }
                
    rightPart[i] = rightPart[i] / coefficients[i][i];
                
    coefficients[i][i] = 0;
            }

            
    // первое приближение решения - преобразованный вектор правых частей
            
    for ( 0numberOfEquation++ ) {
                
    solution[i] = rightPart[i];
            }

            
    // пока не найдено решение с допустимй погрешнстью или пока не исчерпан лимит шагов... если все расходится например
            
    while ( fault precision && step <= 1000 ) {
                
                
    // поиск новой итерации
                
    for ( 0numberOfEquation++ ) {
                    
    tempSolution[j] = 0;
                }
                for ( 
    0numberOfEquation++ ) {
                    for ( 
    0i++ ) {
                        
    tempSolution[i] = tempSolution[i] + coefficients[i][j] * tempSolution[j]; 
                    }
                    for ( 
    inumberOfEquation++ ) {
                        
    tempSolution[i] = tempSolution[i] + coefficients[i][j] * solution[j]; 
                    }
                    
    tempSolution[i] = tempSolution[i] + rightPart[i];
                }

                
    // расчет погрешности
                
    fault 0;
                for ( 
    0numberOfEquation++ ) {
                    
    fault fault + (solution[j] - tempSolution[j])*(solution[j] - tempSolution[j]);
                }
                
    fault sqrtfault );

                
    // сохранение полученной новой итерации
                
    for ( 0numberOfEquation++ ) {
                    
    solution[j] = tempSolution[j];
                }
                
    step++;
            }
        }
        else {
            
    result 1001;
        }
        

        return 
    step;
    }


    void main() {
        
    int ij;
        
    int size;
        
    double **coefficients, *rightPart, *solutionprecision;

        
    cout << "Simple iteration method.\nEnter system dimension: ";
        
    cin >> size;

        
    coefficients = new double*[size];
        for ( 
    0sizei++ ) {
            
    coefficients[i] = new double[size];
        }
        
    rightPart = new double[size];
        
    solution = new double[size];

        for ( 
    0size++ ){
            
    cout << "Enter " << << " row: ";
            for ( 
    0size++ ){
                
    cin >> coefficients[i][j];
            }
        }

        
    cout << "Enter right part: ";
        for ( 
    0size++ ){
            
    cin >> rightPart[j];
        }

        
    cout << "Enter precision: ";
            
    cin >> precision;

        
    int steps iterationcoefficientsrightPartsizesolutionprecision );
        if ( 
    steps 1000 ) {
            
    cout << "Solution for this matrix of coefficients not exist or not found";
        }
        else {
            
    cout << "Solution is:\n";
            for ( 
    0size++ ){
                
    cout << solution[j] << "\n";
            }
            
    cout << "Number of step: " << steps;
        }

        
    cout << "\nPress \"Enter\" to continue..." << endl
        
    getchar();    
    }

    Примеры использования (распечатка листинга):



    PS: Больше не чем помочь немогу