crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Численные методы +Qt, Под Qt
QMainWindow
  опции профиля:
сообщение 5.11.2010, 13:35
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день!
Подскажите, пожалуйста, какие-нибудь библиотеки (или классы) для работы с численными методами (в данном случае требуется решить дифф. уравнение). Может быть и на Qt чего уже сделали. Можно, конечно, и самому алгоритм сделать, но хотелось бы уже готовый и оптимизированный.
Заранее спасибо!))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ernie
  опции профиля:
сообщение 5.11.2010, 13:58
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 13.5.2010
Из: Irkutsk
Пользователь №: 1712

Спасибо сказали: 11 раз(а)




Репутация:   1  


а зачем именно на Qt?можно же просто на c++ взять и использовать вместе с Qt ,навскидку http://forum.developing.ru/showthread.php?9-SDK
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 5.11.2010, 16:35
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(QMainWindow @ 5.11.2010, 13:35) *
какие-нибудь библиотеки (или классы) для работы с численными методами (в данном случае требуется решить дифф. уравнение).

если уравнение первого порядка то смотри в сторону метода рунге-кутта 4 порядка, если высших порядков то можно решить с помощью конечно разностных схем(явных или неявных).

Сообщение отредактировал DEADHUNT - 5.11.2010, 16:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 5.11.2010, 17:55
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да это то понятно)) Алгоритмы - вот в чем вопрос.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 5.11.2010, 20:19
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


вот как то проводил эксперимент, какой метод решает задачу Коши первого порядка с наименьшей погрешностью:
Раскрывающийся текст
#include <iostream>
#include <iomanip>
#include <cmath>
#include <algorithm>

/*
  y' = y * (cos(x) + sin(x))
  y(0) = 1
  y(x) = e(sin(x) - cos(x)) * e
*/

double exact_solution(double x)
{
    return exp(sin(x)) / exp(cos(x)) * exp(1);
}

double f(double x, double y)
{
    return y * (cos(x) + sin(x));
}

// y(x1) = y(x0) + h*f(x0)
double euler(int n)
{
    double h = 1.0 / n;
    double x = 0.0;
    double y = 1;
    double err = 0;
    for (int i = 1; i <= n; ++i, x += h)
    {
        y = y + h * f(x, y);
        err = std::max(err, fabs(y - exact_solution(x)));        
    }
    return err;
}

double rectangle(int n)
{
    double h = 1.0 / n;
    double x = 0.0;
    double y = 1;
    double err = 0;
    for (int i = 1; i <= n; ++i, x += h)
    {
        y = y + h * f(x + h / 2, y);
        err = std::max(err, fabs(y - exact_solution(x)));        
    }
    return err;
}

double simpson(int n)
{
    double h = 1.0 / n;
    double x = 0.0;
    double y = 1;
    double err = 0;
    for (int i = 1; i <= n; ++i, x += h)
    {
        y = y + (h / 6) * (f(x, y) + 4 * f(x + h / 2, y) + f(x + h, y));
        err = std::max(err, fabs(y - exact_solution(x)));        
    }
    return err;
}

double runge(int n)
{
    double h = 1.0 / n;
    double x = 0.0;
    double y = 1;
    double err = 0;
    for (int i = 1; i <= n; ++i, x += h)
    {
        double k1 = f(x, y),
            k2 = f(x + 0.5 * h, y + h / 2 * k1),
            k3 = f(x + 0.5 * h, y + h / 2 * k2),
            k4 = f(x + h, y + h * k3);
        y = y + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4);
        err = std::max(err, fabs(y - exact_solution(x)));        
    }
    return err;
}

int main()
{
    const int n = 80;
    std::cout << std::fixed << std::setprecision(30);
    std::cout << "euler\t" << euler(n) << std::endl;
    std::cout << "rect\t" << rectangle(n) << std::endl;
    std::cout << "simpson\t" << simpson(n) << std::endl;
    std::cout << "runge\t" << simpson(n) << std::endl;
    return 0;
}


в исходнике реализованы следующие методы:
метод эйлера(фактически интегрирование уравнения методом левых прямоугольников) - погрешность O(h)
интегрирование уравнения методов центральных прямоугольников - погрешность O(h^2)
интегрирование уравнения методов симпсона - погрешность O(h^4)
метод рунге-кутта 4 порядка - погрешность O(h^4)
странно но почему то на моих примерах точнее всего считает метод эйлера.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.11.2010, 20:30
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ernie @ 5.11.2010, 16:58) *
а зачем именно на Qt?можно же просто на c++
тоже не понимаю, в каком месте мешать математику с Qt.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 5.11.2010, 23:53
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да, спасибо.
Кстати Р-К. 4го порядка алгоритм я знаю, просто самому влом писать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 10.11.2010, 14:38
Сообщение #8


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Цитата(QMainWindow @ 5.11.2010, 23:53) *
просто самому влом писать.

Они все пишутся максимум за 10 минут каждый, главное понимать алгоритм.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 27.2.2020, 21:30