Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

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

latex.gif

Решите это уравнение методом Адамса при заданных значениях R=1000 ОМ, С=latex1.gif и начальном условии q=0 (t=0) на интервале latex3.gif
Постройте графики.
программа должна работать и с другими значениями
Сравните результаты с аналитическим решением:
latex4.gif

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

Последний раз редактировалось kris_19; 12.01.2019 в 19:59.
kris_19 вне форума Ответить с цитированием
Старый 12.01.2019, 19:49   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

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

Или в раздел Фриланс если вы не хотите ничего делать, а ищете кого-то, кто выполнит ваши задачи за вознаграждение.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.01.2019, 19:58   #3
kris_19
Новичок
Джуниор
 
Регистрация: 12.01.2019
Сообщений: 6
По умолчанию

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

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

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

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

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

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

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

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

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

В результате программы должна получиться такого типа таблица
Код:
  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 вне форума Ответить с цитированием
Старый 12.01.2019, 23:33   #9
kris_19
Новичок
Джуниор
 
Регистрация: 12.01.2019
Сообщений: 6
По умолчанию

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

А что вам даст 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 в 00:11.
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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