Форум программистов, компьютерный форум CyberForum.ru

Задача Коши для системы уравнений (метод Эйлера). Ошибка в решении - C++

Восстановить пароль Регистрация
 
kib
0 / 0 / 0
Регистрация: 25.09.2010
Сообщений: 22
13.04.2014, 20:58     Задача Коши для системы уравнений (метод Эйлера). Ошибка в решении #1
Здравствуйте!
Необходимо решить систему ОДУ.
Исходные данные:
E2 = 5;
Cb = 2 10^-12;
C1 = 10^-6;
C2 = 10^-6;
i = 10^-12;
R = 10^6;
Rb = 20;
R1 = 1000;
R2 = 1000;
R3 = 1000;
L1 = 10^-5;
E1[t] := 10 Sin[20000 Pi t];
Система
UCb'[t] == (1/Cb) ((1/Rb) (E1[t] - E2 - UC1[t] - UCb[t]) - i (Exp[UCb[t]/0.026 - 1]) - (1/R) UCb[t]),
UC1'[t] == (1/C1) (IL1[t] + (1/Rb) (E1[t] - E2 - UC1[t] - UCb[t]) - (1/R1) UC1[t]),
UC2'[t] == (1/C2) (IL1[t] - (1/R3) UC2[t]),
IL1'[t] == (-1/L1) (UC1[t] + UC2[t] - E1[t] + R2 IL1[t]),
UCb[0] == 0,
UC1[0] == 0,
UC2[0] == 0,
IL1[0] == 0.

Решение легко нашлось в системе Wolfram Mathematica, по ним строились графики.
При реализации на C++, в результате получаю inf и nan (как я понимаю, inf означает бесконечность).
Помогите, пожалуйста, найти проблему!
Думаю, что метод Эйлера реализован правильно (решение проверялось на закомментированной системе //Ucf = Uci + Ili/C*(tf-ti); //Ilf = Ili + (E-Uci)/L*(tf-ti)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <string>
 
#define W_E1 3.1415926535897932384626433832795
#define E2 5.0
#define Cb 2e-12
#define C1 1e-6
#define C2 1e-6
#define I 1e-12
#define R 1e+6
#define Rb 20.0
#define R1 1000.0
#define R2 1000.0
#define R3 1000.0
#define L 1e-5
 
using namespace std;
 
double euler(double, double, double, double, double, double, double, double&, double&, double&, double&); //передача параметров по ссылке
 
int main()
{
    double E1i,E10,ti, tf, dt, tmax, Ucbf, Uc1f, Uc2f, Ilf, Ucbi, Uc1i, Uc2i, Ili;
    const string method = "Simple Euler";
 
/* output: file and formats */
    ofstream file;
    file.open ("ode.txt");
    file.precision(6);
    file.setf(ios::fixed | ios::showpoint);
    cout.precision(6);
    cout.setf(ios::fixed | ios::showpoint);
 
/* initial information */
    ti = 0.0;             // initial value for variable
    dt = 0.00001;             // step size for integration
    tmax = 0.001 ;          // inegrate from ti till tmax
    Ucbi = 0.0;
    Uc1i = 0.0;
    Uc2i = 0.0;
    Ili = 0.0;
    E10 = 10*sin(20000*W_E1*ti);
 
 
    file << setw(24) << method << endl;
    file << setw(16) << "t" << setw(16) << "ucb" << setw(16) << "uc1" << setw(16) << "uc2" << setw(16) << "il" << setw(16) << "E1" << endl;
    file << setw(16) << ti << setw(16) << Ucbi << setw(16) << Uc1i << setw(16) << Uc2i << setw(16) << Ili << setw(16) << E10 << endl;
 
/* step 2: integration of ODE */
    while (ti <= tmax)
    {
        tf = ti + dt;
        E1i = 10*sin(20000*W_E1*(ti+dt));
        euler(E1i,ti,tf,Ucbi,Uc1i,Uc2i,Ili,Ucbf,Uc1f,Uc2f,Ilf);
        file << setw(16) << tf << setw(16) << Ucbf << setw(16) << Uc1f << setw(16) << Uc2f << setw(16) << Ilf << setw(16) << E1i << endl;
        ti = tf;
        Ucbi = Ucbf;
        Uc1i = Uc1f;
        Uc2i = Uc2f;
        Ili = Ilf;
    }
 
    cout << "Hello World!" << endl;
    return 0;
}
 
double euler(double E1i, double ti, double tf, double Ucbi, double Uc1i, double Uc2i, double Ili, double& Ucbf, double& Uc1f, double& Uc2f, double& Ilf)
{
     //Ucf = Uci + Ili/C*(tf-ti);
     //Ilf = Ili + (E-Uci)/L*(tf-ti);
    Ucbf = Ucbi + ((1/Rb)*(E1i - E2 - Uc1i - Ucbi) - (1/R)*Ucbi - I*exp(Ucbi/0.026-1))/Cb*(tf-ti);
    Uc1f = Uc1i + (Ili + (1/Rb)*(E1i - E2 - Uc1i - Ucbi) - (1/R1)*Uc1i)/C1*(tf-ti);
    Uc2f = Uc2i + (Ili - (1/R3)*Uc2i)/C2*(tf-ti);
    Ilf = Ili - (Uc1i + Uc2i - E1i + R2*Ili)/L*(tf-ti);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2014, 20:58     Задача Коши для системы уравнений (метод Эйлера). Ошибка в решении
Посмотрите здесь:

C++ метод Ньютона для системы двух уравнений
Решение задачи Коши методом Эйлера и Рунге-Кутты C++
C++ Пример кода для решения системы уравнений
метод Ньютона для решения системы нелинейных уравнений C++
Решение системы дифференциальных уравнений методом Эйлера C++
C++ Метод простых итераций для решения системы линейных уравнений
Явный метод Эйлера для ОДУ C++
C++ Метод Эйлера (решение дифференциального уравнения). Ошибка. Написание программы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 14:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru