Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> решение трехдиагональной матрицы 
:(
    Опции темы
rang3r
Дата 28.11.2010, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 2.4.2009

Репутация: нет
Всего: нет



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

public class test
{
    public final static int l = 1;
    public final static int r = 2;
    public final static double h = 0.01;
    public final static int n = (int) ((r - l) / h);

    public static double[] initMas()
    {
        double[] mas = new double[n];
        for (int i = 0; i < n; i++)
        {
            mas[i] = l + i * h;
        }
        return mas;
    }

    public static double[] getRightSolve(double[] mas)
    {
        double[] solve = new double[mas.length];
        for (int i = 0; i < mas.length; i++)
        {
            solve[i] = Math.exp((-1) * mas[i]) / mas[i];
        }
        return solve;
    }

    public static double[] methodOfThomas(double[] mas)
    {
        double[] a = new double[n];
        double[] b = new double[n];
        double[] c = new double[n];
        double[] f = new double[n];
        double[] P = new double[n];
        double[] Q = new double[n];
        init(mas, a, b, c, f);
        directStep(a, b, c, f, Q, P);
        return reverseStep(a, b, c, f, Q, P);

    }

    private static void init(double[] args, double[] a, double[] b, double[] c, double[] f)
    {
        b[0] = -1 / h;
        c[0] = 1 / h;
        f[0] = -2*Math.pow(Math.E,-1);
        for (int i = 1; i < n - 1; i++)
        {
            a[i] = (args[i] / Math.pow(h, 2) - 1 /  h);
            b[i] = (-2 * args[i] / Math.pow(h, 2) + args[i]);
            c[i] = (args[i] / Math.pow(h, 2) + 1/ h);
            f[i] = 0;
        }
        a[n - 1] = -1 / h;
        b[n - 1] = 1.5 + 1 / h;
        f[n - 1] = 0;
    }

    private static void directStep(double[] a, double[] b, double[] c, double[] f, double[] Q, double[] P)
    {
          P[1]=-c[0]/b[0];
          Q[1]=f[0]/b[0];
                for(int i=1;i<n-1;i++)
                {
                    P[i+1]=-c[i-1]/(a[i-1]*P[i]+b[i-1]);
                    Q[i+1]=(f[i-1]-a[i-1]*Q[i])/(a[i-1]*P[i]+b[i-1]);
                }
    }

    private static double[] reverseStep(double[] a, double[] b, double[] c, double[] f, double[] Q, double[] P)
    {
          double[] y=new double[n];
          y[n-1]=(f[n-1]-a[n-1]*Q[n-1])/(a[n-1]*P[n-1]+b[n-1]);
           for(int i=n-2;i>-1;i--)
           {
               y[i]=P[i+1]*y[i+1]+Q[i+1];
           }
        return y;
    }

    public static void printResult(double[] right, double[] acquire)
    {
        System.out.println("right solve     | acquire solve");
        for (int i = 0; i < right.length; i++)
        {
            System.out.println(right[i] + "|" + acquire[i]);
        }
    }

    public static void main(String[] args)
    {
        final double[] x = initMas();
        final double[] right = getRightSolve(x);
        final double[] acquire = methodOfThomas(x);
        printResult(right, acquire);
    }
}


Результаты следующие:
right solve     | acquire solve
0.36787944117144233|0.9317132047833149
0.33327404677252886|0.8952392329963497
0.3026100760891631|0.8599262928147499
0.2753363211991768|0.825655864472856
0.25099517659350173|0.7922882884094005
0.22920383748815207|0.759711173093414
0.2096398407953943|0.7278341181518192
0.19202982270066035|0.6965846078992286
0.17614068852971893|0.6659047805731226
0.16177261247848115|0.6357488604633688
0.14875344009895322|0.6060810972800887
0.13693417666241486|0.576874097557699
0.1261853237466596|0.5481074618973252
0.11639388401257827|0.5197666628954438
0.1074608965016086|0.49184211404808714
0.09929939625739721|0.46432839136761433
0.09183271567865918|0.43722357801843903
0.08499306287223113|0.4105287087513266
0.07872032590665004|0.38424729584740464
0.07296106235205824|0.35838492207017825 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0375 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.