Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 12.01.2019, 20:41   #1
kris_19
Новичок
Джуниор
 
Регистрация: 12.01.2019
Сообщений: 6
Репутация: 10
По умолчанию Решение уравнения методом Адамса

Доброго времени суток всем!!! Помогите реализовать программу на С#.

Заряд (q) конденсатора с емкость С, который заряжается батареей (V), последовательно соединенной с резистором (R),
описывается следующим уравнением:

Название: latex.gif
Просмотров: 41

Размер: 442 байт

Решите это уравнение методом Адамса при заданных значениях R=1000 ОМ, С=Название: latex1.gif
Просмотров: 36

Размер: 162 байт и начальном условии q=0 (t=0) на интервале Название: latex3.gif
Просмотров: 36

Размер: 400 байт
Постройте графики.
программа должна работать и с другими значениями
Сравните результаты с аналитическим решением:
Название: latex4.gif
Просмотров: 36

Размер: 531 байт

Пожалуйста помогите! Мне нужна помощь в том, как это уравнение правильно записать методом Адамса. Заранее спасибо!

Последний раз редактировалось kris_19; 12.01.2019 в 20:59.
kris_19 вне форума   Ответить с цитированием
Старый 12.01.2019, 20:49   #2
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 18,650
Репутация: 3570

icq: 512-765
skype: alexp.frl
По умолчанию

Вы не перепутали "помогите" и "сделайте за меня"?

покажите свои наработки, конкретные вопросы и т.п. Если кто-то просто решит за вас, это вряд ли поможет вам разобраться.
http://www.programmersforum.ru/announcement.php?f=31

Или в раздел Фриланс если вы не хотите ничего делать, а ищете кого-то, кто выполнит ваши задачи за вознаграждение.
Alex11223 вне форума   Ответить с цитированием
Старый 12.01.2019, 20:58   #3
kris_19
Новичок
Джуниор
 
Регистрация: 12.01.2019
Сообщений: 6
Репутация: 10
По умолчанию

Мне нужна помощь в том, как это уравнение правильно записать методом Адамса, саму программу я сделаю.

Последний раз редактировалось kris_19; 12.01.2019 в 21:04.
kris_19 вне форума   Ответить с цитированием
Старый 12.01.2019, 22:04   #4
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 410
Репутация: 236
По умолчанию

само описание на Wikipedia
Выбираете одну из формул, каким-нибудь простым методом (Эйлера или тем же Адамса по схеме прогноз-коррекция) получаете набор недостающих точек.

После этого - просто табулируете функцию с шагом deltaT.
Для сравнения с эталоном рядом выводите эталонное значение в точке T.

Сама формула будет такой
1. y[n+1] вычисляется по формуле прогноза (явным методом Адамса — Башфорта)
2. y[n+1] вычисляется по формуле коррекции (неявным методом Адамса — Мультона)
Два шага требуется из-за того, что для неявных методов требуется значение y[n+1], которое ещё не вычисленно (т.к. именно его и собираемся вычислять). Поэтому первое приближение получается по формуле прогноза, а по формуле коррекции его значительно уточняют.

Последний раз редактировалось FPaul; 12.01.2019 в 22:18.
FPaul вне форума   Ответить с цитированием
Старый 12.01.2019, 22:47   #5
kris_19
Новичок
Джуниор
 
Регистрация: 12.01.2019
Сообщений: 6
Репутация: 10
По умолчанию

Я не совсем понимаю как правильно записать уравнение методом Адамса, которое дано в условии.
kris_19 вне форума   Ответить с цитированием
Старый 12.01.2019, 23:00   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 410
Репутация: 236
По умолчанию

Для понимания соответствия формул, делаете замену q на y.
Вы имеете
y'=f(t,y)
т.е.
f(t,y)=(V/R)-y/(R*C)
А дальше численно решаете дифур, т.е. табулируете y(t) при t от 0 до 5*10^(-2). Т.к. точность не указана, то сделайте в 10 или 20 точках.

Посмотрите пример вычислений без привязки к языку программирования
http://info.alnam.ru/book_clm.php?id=112 на странице 450

Я поверхностно знаю C, заметно хуже C++ и совсем никак C#. Сделать даже подобие примера совсем не смогу.

Последний раз редактировалось FPaul; 12.01.2019 в 23:06.
FPaul вне форума   Ответить с цитированием
Старый 12.01.2019, 23:11   #7
kris_19
Новичок
Джуниор
 
Регистрация: 12.01.2019
Сообщений: 6
Репутация: 10
По умолчанию

Мне главное понять как правильно уравнение записывается математически, а в код смогу реализовать. С таким методом просто не сталкивалась, поэтому приходиться разбираться с нуля.
kris_19 вне форума   Ответить с цитированием
Старый 13.01.2019, 00:07   #8
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 410
Репутация: 236
По умолчанию

В результате программы должна получиться такого типа таблица
Код:
  t          y          Yetalon
0.000  0.0000000000  0.0000000000
0.005  0.0000039323  0.0000039347
0.010  0.0000063183  0.0000063212
0.015  0.0000077485  0.0000077687
0.020  0.0000086234  0.0000086466
0.025  0.0000091589  0.0000091792
0.030  0.0000094860  0.0000095021
0.035  0.0000096859  0.0000096980
0.040  0.0000098081  0.0000098168
0.045  0.0000098827  0.0000098889
0.050  0.0000099283  0.0000099326
Это я сделал на знакомом мне Pascal.
Первая строка - начальные значения.
Вторая строка вычислена методом Рунге-Кутты 4 порядка.
Третья строчка вычислена методом Рунге-Кутты 4 порядка.
Четвёртая и последующие вычислены по формулам (прогноза и коррекции) метода Адамса 3 порядка
FPaul вне форума   Ответить с цитированием
Старый 13.01.2019, 00:33   #9
kris_19
Новичок
Джуниор
 
Регистрация: 12.01.2019
Сообщений: 6
Репутация: 10
По умолчанию

Можете пожалуйста скинуть код, если не сложно
kris_19 вне форума   Ответить с цитированием
Старый 13.01.2019, 00:34   #10
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 410
Репутация: 236
По умолчанию

А что вам даст Pascal?
Код:
program Adams3_;

const
  V  = 1.0;
  R  = 1000.0;
  C  = 1e-5;
  Y0 = 0.0;
  Tstart = 0.0;
  Tfinish = 5e-2;

  function Yetalon(t: real): real;
  begin
    Yetalon := C * V * (1 - exp(-t / (R * C)));
  end;

  function f(t, y: real): real;
  begin
    f := (V / R) - (y / (R * C));
  end;

  procedure RungeKutta4Step(var t, y: real; h: real);
  var
    k1, k2, k3, k4: real;
  begin
    k1 := f(t, y);
    k2 := f(t + (h / 2), y + k1 * (h / 2));
    k3 := f(t + (h / 2), y + k2 * (h / 2));
    k4 := f(t + h, y + k3 * h);
    y  := y + (k1 + 2 * k2 + 2 * k3 + k4) * h / 6;
    t  := t + h;
  end;

  procedure Adams3(t0, tfin, y0: real; Nprint: integer);
  const
    {коэффициенты в формуле прогноза}
    P0 = 5 / 12;
    P1 = -4 / 3;
    P2 = 23 / 12;
    {коэффициенты в формуле коррекции}
    C0 = 1 / 24;
    C1 = -5 / 24;
    C2 = 19 / 24;
    C3 = 3 / 8;
  var
    h: real;
    t: real;
    Yn0, Yn1, Yn2, Yn3: real;
  begin
    if Nprint <= 3 then
      exit;
    h := (tfin - t0) / Nprint;
    writeln('  t          y          Yetalon');
    writeln(t0: 5: 3, y0: 14: 10, Yetalon(t0): 14: 10);
    {инициализация значения y[n]}
    t := t0;
    Yn0 := y0;
    {вычисление значений y[n+1], y[n+2] одношаговыми методами (Рунге-Кутты 4-го порядка)}
    Yn1 := Yn0;
    RungeKutta4Step(t, Yn1, h);
    writeln(t: 5: 3, Yn1: 14: 10, Yetalon(t): 14: 10);

    Yn2 := Yn1;
    RungeKutta4Step(t, Yn2, h);
    writeln(t: 5: 3, Yn2: 14: 10, Yetalon(t): 14: 10);
    {вычисление остальных точек методом Адамса}
    while (t + h) <= (tfin + h / 2) do
    begin
      {- по формуле прогноза явным методом Адамса — Башфорта}
      Yn3 := Yn2 + h * (P2 * f(t, Yn2) + P1 * f(t - h, Yn1) + P0 * f(t - 2 * h, Yn0));
      {- по формуле коррекции неявным методом Адамса — Мультона}
      Yn3 := Yn2 + h * (C3 * f(t + h, Yn3) + C2 * f(t, Yn2) + C1 *
        f(t - h, Yn1) + C0 * f(t - 2 * h, Yn0));
      t := t + h;
      {вывод результатов}
      writeln(t: 5: 3, Yn3: 14: 10, Yetalon(t): 14: 10);
      {сдвиг параметров для следующего шага вычислений}
      Yn0 := Yn1;
      Yn1 := Yn2;
      Yn2 := Yn3;
    end;

  end;

const
  a  = Tstart;
  b  = Tfinish;
  Ya = Y0;
  Nprint = 10;
var
  yfin: real;
begin
  writeln('Решение с фиксированным шагом ', (b - a) / Nprint: 0: 3);
  Adams3(a, b, Ya, Nprint);
end.
Это не очень хорошая реализация. Методы Адамса очень экономны в вычислениях, конкретно в обращениях к f(t,y). Т.е. в программе нужно сохранять не только y[n]...y[n+2], но и значения функций f(t[n], y[n])...f(t[n+2], y[n+2]). Т.е. при оценке качества реализации (не каждым преподавателем) оценивается и эффективность вычислений - отсутствие повторных вычислений возможно сложнореализуемой функции.

Последний раз редактировалось FPaul; 13.01.2019 в 01:11.
FPaul вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение задачи Коши для систем двух дифференциальных уравнений экстраполяционным методом Адамса Шляпа Общие вопросы C/C++ 0 19.06.2015 14:26
решение уравнения методом итерации mike1988 Помощь студентам 6 09.06.2015 11:25
"Решение системы линейных алгебраических уравнений методом простой итерации" и "Решение нелинейного уравнения методом итерации" BORODA77 Помощь студентам 0 19.03.2014 17:31
решение уравнения методом хорд и методом Ньютона Маргоша)) Общие вопросы Delphi 1 21.04.2010 20:40
Решение уравнения методом деления отрезка пополам. Методом секущей. Panda196 Паскаль 3 25.11.2008 10:06


09:04.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru