Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346

Программирование уравнения переноса

04.02.2017, 22:25. Показов 3130. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Функцию Хэвисайда запрограммировал вот так
Получил ступенчатую функцию
C++
1
2
3
4
5
6
7
public:static double fn(double T,double x)//Функция Хэвисайда
                   {
                           if (x>=0)
                                   return T;
                           else if(x<0)
                                   return 0;  
                   }
В самом задании нужно сделать так чтобы образовались "ступеньки" то есть перенос функции Хэвисайда.
Нужно использовать формулу явной разностной схемы

Задаём сначала сами сетки
C++
1
2
3
4
5
6
7
8
9
10
11
 for(int i = 0;i<Nx;i++)    
                         {
                             wx[i+1]=wx[i]+hx;//массив 
                             wht[0][i]=qx0(wx[i]);
                         }  
 
                         for(int j = 0;j<Nt;j++) //N+1 j+1
                         {                           
                             wt[j+1]=wt[j]+ht;
                             wht[j+1][0] = qt0(wt[j+1]);                                                                                         
                         }
В итоге массив
C++
1
wht[j][i]
получился таким(я его проверил в блокноте)см.рисунок(x шаг 0,1 а t - это 0,3

А вот сама формула явной разностной схемы

C++
1
2
3
4
5
6
7
8
gama=(a*ht)/hx; //Число Куранта
               for(int i = 0;i<Nx;i++) 
                           {
                        for(int j = 0;j<Nx;ij++)
                                {
                                wht[j+1][i]=((wht[j+1][i]-wht[j][i])/ht)+a*((wht[j][i+1]-wht[j][i])/hx);
                                }
                        }
Плюс я ещё выразил(пока что аналитически)
C++
1
wht[j+1][i]
- на этом форуме проверили) https://<b>https://www.cyberfo... 8.html</b>

Если выразиться ещё проще.Вот нашёл я значения сетки,а что нужно найти дальше?
Формула явной разностной схемы есть,после(судя по книгам Самарского откуда я беру теорию) идёт вот эта формула

https://www.cyberforum.ru/cgi-bin/latex.cgi?{{y}_{k}}^{j+1}= {{y}_{k+1}}^{j}+(1+\gamma )+{{y}_{k}}^{j}

C++
1
 wht[j+1][i]=gama*wht[j][i+1] + (1 + gama)*wht[j][i]
так вот вопрос такой
В формуле явной разностной схемы используются только массивы с шагами сеток,а вот формул где нужно использовать исходную функцию(в моём случае Функцию Хэвисайда) я не вижу,какие действия нужно предпринять.
Миниатюры
Программирование уравнения переноса   Программирование уравнения переноса  
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.02.2017, 22:25
Ответы с готовыми решениями:

Найти ошибку в решении уравнения переноса
помогите найти ошибку. преподаватель сказал есть ошибка. \frac{du}{dt}+c\frac{du}{dx}=f(u,x,t) найти решение u(x,t) того уравнения с...

Динамическое программирование. Функциональные уравнения Бернули
Всем доброго времени суток! На втором курсе проходили замечательную дисциплину &quot;Математическое программирование&quot;. Захотелось...

Программирование одномерных массивов. Программирование двумерных массивов. Программирование динамических массивов VBA
1. Написать процедуру по упорядочению элементов заданного массива В в следующем порядке: сначала идут положитель- ные числа, потом – нули и...

13
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
05.02.2017, 12:37  [ТС]
Пока вот что получилось(см.рисунок)

Для правильности решения нужно выровнять и убрать скачки которые остаются внизу

Для нынешнего результата применил формулу(Спасибо учебнику Лебедева)
C++
1
2
3
4
5
6
7
for(int i = 0;i<Nx;i++)
             {
                for(int j = 0;j<Nt;j++)
                    {                               
                        wht[j+1][i]=(1-a * (ht/hx)) \cdot wht[j][i]+a* (ht/hx)*wht[j][i]+ht *fn(wx[i],wt[j]);
                    }
}
где fn это моя функция Хэвисайда,а wx[i]-моя ось с шагами h=0.1, а wt[j]-ось t с шагами [math]\tau[/math]

Пока мысль такова что я просто не те параметры передаю в свою функцию fn..
Миниатюры
Программирование уравнения переноса  
0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
05.02.2017, 21:40  [ТС]
В результате работы следующего кода,график функции немного изменился.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(int i = 0;i<Nx;i++)
                         {
                             for(int j = 0;j<Nt;j++)
                             {
                                 wht[i+1][j]=((wht[i][j+1]-wht[i][j])/ht)+a*((wht[i][j]-wht[i][j-1])/hx);//
                             }
                         }
                         
                         for(int i = 0;i<Nx;i++)
                         {
                             for(int j = 0;j<Nt;j++)
                             {
                                 wht[i+1][j]=(1-a*(ht/hx))*wht[i][j]+a*(ht/hx)*wht[i][j]+ht*fn(T,x);
                             }
                         }
Как оказалось в функции
C++
1
fn
нужно было другие параметры,а именно оригинальные параметры
C++
1
fn(T,x)
. Да график немного стал получше..
Миниатюры
Программирование уравнения переноса  
0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
07.02.2017, 12:50  [ТС]
Это было в качестве эксперимента(как выяснилось 2 цикла по отдельности делать это неудачное решение)

На данный момент я выразил [math]$y^{j+1}_i$[/math] (Здесь на форуме мне указали мои ошибки,спасибо)
Вот полная формула(Она была проверена руководителем и верна,процесс решения уравнения записан аналитически)

https://www.cyberforum.ru/cgi-bin/latex.cgi?$y^{j+1}_i=\frac{-a\cdot \tau y^j_{i+1} + a\cdot \tau y^j_{i} +  y^j_{i+1} \cdot h}{h}$

Вопрос
до нахождения https://www.cyberforum.ru/cgi-bin/latex.cgi?$y^{j+1}_i$

Получается я должен найти аппроксимацию,сходимость,устойчивость формулы явной разностной схемы и только потом выразить https://www.cyberforum.ru/cgi-bin/latex.cgi?$y^{j+1}_i$?

P.S.
В учебниках Самарского и не только,в большинстве случаев идёт сначала формула схемы,а потом и последующие действия такие как аппроксимация,нахождения сходимости и устойчивости
но ключевое слово в большинстве(так как бывает сразу в метод гармоник уходит вычисление)
0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
08.02.2017, 22:17  [ТС]
И всё-таки вопрос что мне делать дальше чтобы найти решение уравнения переноса?с правильным графиком...

выразил [math]y_{j+1}^{i}[/math] а как дальше быть?

вот есть формула
https://www.cyberforum.ru/cgi-bin/latex.cgi?y_{j+1}^{i} = -  \gamma*y_{j}^{i+1}  + (1+ \gamma )*y_{j}^{i}

и есть метод гармоник

Что мне находить дальше?
0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
10.02.2017, 18:26  [ТС]
Чтож плавно перешёл к такой проблеме(все остальные узнал)

Проблема в программировании формулы

Формула представлена на рисунке

Её код

C++
1
2
3
4
5
6
7
for(int i = 0;i<Nx;i++)///Вывод формул wht[j+1][i] проследить за циклами
                         {
                             for(int j = 0;j<Nt;j++)
                             {
                                 wht[j+1][i]=(-a*ht*wht[j][i+1]+a*ht*wht[j][i]+wht[j][i]*hx)/hx;
                             }
                         }
А теперь провожу расшифровку формулы:

ht= 0,3 она же https://www.cyberforum.ru/cgi-bin/latex.cgi?\tau(шаг по времени)
hx=0,1 она https://www.cyberforum.ru/cgi-bin/latex.cgi?h(шаг по пространству)
Nt=12 это количество разбиений отрезков по оси t
Nx= 10 это количество разбиений отрезко по оси x
a - это скорость
wht[j+1][i] - это собственно неизвестное число или https://www.cyberforum.ru/cgi-bin/latex.cgi?y{i}^{j}

на данном этапе смешной и простой вопрос,правильный ли синтаксис у программного кода?
Изображения
 
0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
15.02.2017, 15:20  [ТС]
Осталось совсем немного,половина ошибок исправлено

Текущая проблема

Если взглянуть на график то одна из причин,которая создаёт такой график это неправильный цикл.


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

Вот мои циклы,отвечающие за вычисление,запоминание в файл и вывод на график.

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
                     for(int j = 0;j<=Nx;j++)
                     {  
                         for(int i = 0;i<=Nt;i++)
                         {
            wht[i][j+1]=((-a*ht*wht[i][j]+a*ht*wht[i][j]+wht[i-1][j]*hx)/hx);
                         }
                     }
 
                     //----Для записи в простой текстовый файл                    
                     String^ fileName = "results.txt";
                     StreamWriter^ sw = gcnew StreamWriter(fileName);
 
                     for(int j = 0;j<=Nt;j++)   
                     {
                         for(int i = 0 ;i<=Nx;i++)
                         {
                             sw->Write("{0} ",wht[j][i]); 
                         }
                         sw->WriteLine();
                     }
                     sw->Close();  
 
 
                     ///---------------Построение графика
 
                     for(int j = 0;j<=Nt;j++)
                     {
                         for(int i = 0;i<=Nx;i++)
                         {
                             chart2->Series["Series2"]->BorderWidth=3;          
                             chart2->Series["Series2"]->Points->AddXY(i,wht[j][i]);
                         }
                     }                                           
                 }

Но от дельной подсказки(не решения кода,а именно подсказки я бы не отказался)
Миниатюры
Программирование уравнения переноса  
0
15.02.2017, 18:09

Не по теме:

redseven, смотрю на ваш монолог, и появляется желание поучаствовать хотя бы из уважения к вашему упорству, но, чёрт возьми, не разбираюсь в вашей темею

0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
15.02.2017, 20:01  [ТС]
Kerry_Jr,

Вы сможете мне помочь простой синтаксической проверкой

Просто скажите правильный код или нет.

Вот формула полученная аналитически(она правильная)

https://www.cyberforum.ru/cgi-bin/latex.cgi?{y}^{j+1}_{i} =\frac{a * \tau {y}^{j}_{i} + a* \tau {y}^{j}_{i-1}+ h*{y}^{j}_{i} }{h}

а вот её код(вот его нужно синтаксис глянуть)

C++
1
wht[j+1][i]=(-a*ht*wht[j][i]+a*ht*wht[j][i-1]+wht[j][i]*hx)/hx;
Просто я тут вспомнил приоритеты арифметических операций и стал изменять положение скобок и умножений и мой график стал менятся
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
15.02.2017, 20:11
redseven, синтаксически всё верно, только вы в формуле минус упустили у членаhttps://www.cyberforum.ru/cgi-bin/latex.cgi?a\tau y_i^j
0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
15.02.2017, 20:34  [ТС]
Да это невнимательность моя.

А вот так можно?

C++
1
wht[i][j+1]=(-a*ht*(wht[i][j]+wht[i-1][j])+hx*(wht[i][j]))/hx;
Просто график немного становится похожим на то что мне нужно
0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
20.02.2017, 18:08  [ТС]
И так проблема найдена в коде

C++
1
2
3
4
5
 for(int i = 0;i<Nx;i++)        
                     {
                         wx[i+1]=wx[i]+hx;//массив 
                         wht[0][i]=fn(T,i*hx);//i*hx
                     }
где fn это
C++
1
2
3
4
5
6
7
public:static double fn(int T,double x)//Функция Хэвисайда - Начальное условие(Граничное условие) а начальное 0-1
           {
               if (x>=0)
                   return T;
               else if(x<0)
                   return 0;  
           }
Я неправильно задаю начальные условия

Как вино на графике среди безобразия там где-то видно общее решение "волна",но остальное там неправильно как раз из за того что я в коде неправильно задаю начальные условия
Миниатюры
Программирование уравнения переноса  
0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
24.02.2017, 21:05  [ТС]
А вот теперь точно ошибка в коде
Вот вопрос.
Скажите можно ли в TChart(Microsoft Visual Studio 2012 C++) вывести метод,который возвращает void?
0
58 / 16 / 26
Регистрация: 07.02.2015
Сообщений: 346
26.02.2017, 13:25  [ТС]
Всё теперь осталось дело за малым
Помогите подправить график(чтобы корректно выводился а не уходил в 0)
Как видно на рисунке.
Если убрать это заход в 0,то график будет правильный на 100 процентов.

Вот код вычисления с выводом графика

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(int j=0; j < Nt-1; j++)//Вывод устойчивой схемы
               {
                   wht[j+1][0] = u1(a,xmin,j*ht);//xmin
                   for(int i=1; i<Nt; i++)
                   {
                       double dudx = (wht[j][i] - wht[j][i-1])/hx;
                       wht[j+1][i] = -a * dudx * ht + wht[j][i];
                   }
               }
 
for(int j = 0;j<Nt;j++)//Nx и Nt это количество отрезков по осям x и t(я использую 10 и 12 соответственно)
               {
                   for(int i = 0;i<Nx-1;i++)
                   {                  
                       chart2->Series["Series1"]->BorderWidth=3;            
                       chart2->Series["Series1"]->Points->AddXY(i,wht[j][i]);                      
                   }
               }

а сам график такой(Вот самому думается что с циклом вывода графика проблемы,но увы сам не могу понять где именно)
Миниатюры
Программирование уравнения переноса  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.02.2017, 13:25
Помогаю со студенческими работами здесь

Выбор кафедры в дальнейшей жизни: прикладное программирование VS системное программирование
Сразу извиняюсь что очень не по теме но всё же лучшего форума для этого вопроса я не нашел. Итак я вступаю во взрослую жизнь и давно...

Хочу изучать программирование какой язык программирование выбрать ?
Хочу изучать программирование какой язык (С, С++, С# или Delphi) программирование выбрать ? Цель создание : 1.транслит кирилл на...

Программирование функций, Программирование процедур, рекурсивную подпрограммa
1 (Программирование функций) Вычислить площадь правильного шестиугольника со стороной a, используя подпрограмму вычисления площади...

Криптография, многопоточное программирование, сетевое программирование
Не знаю, с чего начать, подскажите: В этом задании необходимо реализовать клиент-серверное приложение, позволяющее суммировать...

Составить уравнения высот треугольника, если известны уравнения его сторон
составить уравнения высот треугольника, если известны уравнения его сторон: 2x-y+3=0 , x+5y-7=0 , 3x-2y+6=0


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru