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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kib
0 / 0 / 0
Регистрация: 25.09.2010
Сообщений: 22
#1

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

13.04.2014, 20:58. Просмотров 357. Ответов 0
Метки нет (Все метки)

Здравствуйте!
Необходимо решить систему ОДУ.
Исходные данные:
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++
Добрый день! Столкнулся с проблемой, при решении задачи, а именно : Реализовать решение системы оду с количеством уравнений N,...

Метод Рунге-Кутта для системы из 5 уравнений - C++
Нужно написать программу для решения системы дифуров. Задано 5 уравнений, необходимо вывести таблицу значений х1...х5 в зависимости от t....

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

Метод Ньютона для системы двух уравнений - C++
Здравствуйте! помогите, пожалуйста, чайнику от программирования написать код) смысл заключается в том, что нужно создать программу,...

Метод хорд для решения системы нелинейных уравнений - C++
Здравствуйте, задал вопрос по чисмету вот тут http://www.cyberforum.ru/numerical-methods/thread1529078.html#post8064137 Не знаю,...

Решение системы дифференциальных уравнений методом Эйлера - C++
В интернете нашел похожий код, но для 1 уравнения, может кто помочь сделать для 2? Тоесть для системы #include &quot;stdafx.h&quot; ...

Метод простых итераций для решения системы линейных уравнений - C++
помогите найти ошибку в алгоритме при вводе уравнения x+y = 2 2x-y = 7 x = 2-y; y = (7-2*x)/-1 double ...

Метод Эйлера (решение дифференциального уравнения). Ошибка. Написание программы - C++
Здравствуйте, прошу помощи, т.к. в программировании я не силен... Имеется полу написанная программа, которая выдает ошибку. Нужно...

Явный метод Эйлера для ОДУ - C++
есть код #include&quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;fstream&gt; using namespace std; double const...

Решение задачи Коши методом Эйлера и Рунге-Кутты - C++
Доброго времени суток всем:) Писал прогу для решения задачи Коши методом Эйлера и Рунге-Кутты на С++. Вроде бы все реализовал, но при...

Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка - C++
решить методами эйлера-коши с итерациями и рунге -куты четвертого порядка диф. уравнение y`+ycosx=e-sinx X e, y(0)=1 h=0.1


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru