С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
MaikWazovski
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
#1

Метод рунге-кутта 3 порядка - C++

17.05.2014, 19:14. Просмотров 1356. Ответов 14
Метки нет (Все метки)

дана функция d(y(x))/dx=e^x-2y(x)
Нач. условия y(0)=e

Код
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
#include<stdio.h>
#include<conio.h>
#include<math.h>
float fun(float x, float y)
{
return exp(x)-2*y;
}
int main()
{
int i,j,N;
float x0,y0,x,h,y,k[200][200],Y[200],n,p,a;
//clrscr();
printf("\n Enter the initial value of X0:");
scanf("%f",&x0);
printf("\n Enter the initial value of Y0:");
scanf("%f",&y0);
printf("\n Enter the given value of X:");
scanf("%f",&x);
printf("\n Enter the value of step size h:");
scanf("%f",&h);
n=(x-x0)/h;
N=(int)n;
printf("\nNumber of iterations is:%d\n",N);
for(i=1;i<=N;i++)
{
k[i][1]=h*fun(x0,y0);
k[i][2]=h*fun(x0+0.5*h,y0+0.5*k[i][1]);
k[i][3]=h*fun(x0+h,y0+2*k[i][2]+k[i][1]);
y = y0+(k[i][1] + 4 * k[i][2] + k[i][3])/6;
 
}printf("Y(%f)=%f",a,Y[i]);
printf("\n");
printf("\nk1\t\tk2\t\tk3\t\tY\n");
printf("\n");
 
for(i=1;i<=N;i++)
{
for(j=1;j<=5;j++)
{
printf("%f\t",k[i][j]);
}
a=x0+h;
 
printf("\n");
 
}
printf("\nThe final value of Y:\t%f",y);
getch();;
}
Что не так помогите
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2014, 19:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Метод рунге-кутта 3 порядка (C++):

Метод Рунге-Кутта 3 порядка - C++
Начерикал что-то,вроде бы работает,но не уверен,да и не доходит,как под условия сделать задачи,тыкните,пожалуйста #include &quot;stdafx.h&quot; ...

Метод Рунге-Кутта 4-го порядка - C++
Правильно ли я записал выражения для коэффициентов моего уравнения(система Лоренца) #include &lt;math.h&gt; #include &lt;stdlib.h&gt; ...

Метод Рунге-Кутта 2-го порядка - C++
Написал код программы. С компиляцией вроде бы нет проблем. А цикл for воспринимать не хочет. Программа просто его пропускает. Помогите...

Метод Рунге-Кутта 4-го порядка - C++
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; double f(double x, double y) { ...

Метод Рунге-Кутта 4 порядка - C++
Помогите найти ошибку в методе рунге-Кутта 4 порядка System::System(double m, const Vector3D&amp; g, double C, double f, double p, double S,...

Метод Рунге-Кутта второго порядка - C++
В общем есть задание. Задание к-е на скрине: Ток в электрической цепи описывается дифференциальным уравнением (которое на скрине),...

14
S_el
2113 / 1634 / 308
Регистрация: 15.12.2013
Сообщений: 6,406
17.05.2014, 19:24 #2
MaikWazovski, выражение после return поставьте в скобки.
0
zss
Модератор
Эксперт С++
6590 / 6152 / 2026
Регистрация: 18.12.2011
Сообщений: 16,041
Завершенные тесты: 1
17.05.2014, 19:32 #3
Цитата Сообщение от S_el Посмотреть сообщение
выражение после return поставьте в скобки.
Зачем?

Добавлено через 5 минут
Цитата Сообщение от MaikWazovski Посмотреть сообщение
for(j=1;j<=5;j++)
{
printf("%f\t",k[i][j]);
}
Значения присваивались k[i][1],k[i][2],k[i][3]
1.Откуда взялись k[i][4],k[i][5]?
2. Зачем память под k[i][0] и k[i][6]-k[i][199]?
3. Зачем вообще понадобилось k[i][j] заносить в массив?
Они ведь используются однократно
0
MaikWazovski
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
17.05.2014, 19:39  [ТС] #4
надо что бы вывела прога таблицу со значениями, правда лучше бы сделать её без задания с клавы, но хочу так сделать)
а про массив не понял можно подробнее?
0
zss
Модератор
Эксперт С++
6590 / 6152 / 2026
Регистрация: 18.12.2011
Сообщений: 16,041
Завершенные тесты: 1
17.05.2014, 19:40 #5
C++
1
2
3
4
5
6
7
8
9
10
11
Y[0]=y0;
for(i=1;i<=N;i++)
{
   printf("x=%f,Y=%f",x0,Y[i]);
   y0=y[i-1];
   double k1=h*fun(x0,y0);
   double k2=h*fun(x0+0.5*h,y0+0.5*k1);
   double k3=h*fun(x0+h,y0+2*k2+k1);
   Y[i] = Y[i-1]+(k1 + 4. * k2 + k3)/6.;
   x0+=n; 
}
0
MaikWazovski
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
17.05.2014, 19:43  [ТС] #6
значения x and y
выводит она k1 k2 k3 y -выводит по какой то причине значения с минусом не понимаю по какой причине
0
zss
Модератор
Эксперт С++
6590 / 6152 / 2026
Регистрация: 18.12.2011
Сообщений: 16,041
Завершенные тесты: 1
17.05.2014, 19:59 #7
Значения k1-k3 Вас не должны беспокоить.
Это промежуточные вычисления.
0
MaikWazovski
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
17.05.2014, 20:01  [ТС] #8
zss, Я исправил на что вы указали, но считает она не совсем так как надо
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
#include<stdio.h>
#include<conio.h>
#include<math.h>
float fun(float x, float y)
{
return exp(x)-2*y;
}
int main()
{
int i,j,N;
float x0,y0,x,h,y,k1,k2,k3,Y[200],n,p,a;
//clrscr();
printf("\n Enter the initial value of X0:");
scanf("%f",&x0);
printf("\n Enter the initial value of Y0:");
scanf("%f",&y0);
printf("\n Enter the given value of X:");
scanf("%f",&x);
printf("\n Enter the value of step size h:");
scanf("%f",&h);
n=(x-x0)/h;
N=(int)n;
printf("\nNumber of iterations is:%d\n",N);
Y[0]=y0;
for(i=1;i<=N;i++)
{
double k1=h*fun(x0,y0);
double k2=h*fun(x0+0.5*h,y0+0.5*k1);
double k3=h*fun(x0+h,y0+2*k2-k1);
Y[i] = Y[i-1]+(k1 + 4 * k2 + k3)/6;
printf("x=%f,Y=%f",x0,Y[i]);
x0+=n;
}
printf("\n");
printf("\tY\n");
printf("\n");
 
for(i=1;i<=N;i++)
{
for(j=1;j<=5;j++)
{
 
}
a=x0+h;
 
printf("\n");
 
}
printf("\nThe final value of Y:\t%f",y);
getch();;
}
Добавлено через 2 минуты
zss, я понимаю, мне необходимы были они для проверки в maple
0
zss
Модератор
Эксперт С++
6590 / 6152 / 2026
Регистрация: 18.12.2011
Сообщений: 16,041
Завершенные тесты: 1
17.05.2014, 20:02 #9
C++
1
printf("\nThe final value of Y:\t%f",Y[N]);
Строки 35-48 лишние
и еще опечатка в 32 строке
C++
1
x0+=h;
0
MaikWazovski
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
17.05.2014, 20:22  [ТС] #10
zss, программа должна дать таблицу, что бы построить кривую, но значения которые получаются не совпадают c maple, max значение по x=2,max по y=2.4, а в результате выполнения программы выходит только первое значение более подходит так как там 2.3 следующие значения 100,2000...
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
#include<stdio.h>
#include<conio.h>
#include<math.h>
float fun(float x, float y)
{
return exp(x)-2*y;
}
int main()
{
int i,j,N;
float x0,y0,x,h,y,k1,k2,k3,Y[200],n,p,a;
//clrscr();
printf("\n Enter the initial value of X0:");
scanf("%f",&x0);
printf("\n Enter the initial value of Y0:");
scanf("%f",&y0);
printf("\n Enter the given value of X:");
scanf("%f",&x);
printf("\n Enter the value of step size h:");
scanf("%f",&h);
n=(x-x0)/h;
N=(int)n;
printf("\nNumber of iterations is:%d\n",N);
Y[0]=y0;
for(i=1;i<=N;i++)
{
double k1=h*fun(x0,y0);
double k2=h*fun(x0+0.5*h,y0+0.5*k1);
double k3=h*fun(x0+h,y0+2*k2-k1);
Y[i] = Y[i-1]+(k1 + 4 * k2 + k3)/6;
printf("x=%f,Y=%f",x0,Y[i]);
x0+=n;
}
printf("\n");
 
printf("\nThe final value of Y:\t%f",Y[N]);
getch();;
}
Добавлено через 6 минут
zss, да опечатка именно она)

Добавлено через 1 минуту
вот блин, всё хорошо, Y выводит отлично)
а вот с X проблема(
0
zss
Модератор
Эксперт С++
6590 / 6152 / 2026
Регистрация: 18.12.2011
Сообщений: 16,041
Завершенные тесты: 1
17.05.2014, 20:25 #11
Надо 31 строчку поставить перед 27-ой.
Т.е. сначала вывести значения, а потом делать пересчет.
0
MaikWazovski
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
17.05.2014, 20:35  [ТС] #12
zss, не все Y положительные

Добавлено через 7 минут
x возрастает на 1, а в данной программе 0.1zss,

Добавлено через 1 минуту
zss, если менять строку то программа выдаёт 0 во всех значения
0
zss
Модератор
Эксперт С++
6590 / 6152 / 2026
Регистрация: 18.12.2011
Сообщений: 16,041
Завершенные тесты: 1
17.05.2014, 20:37 #13
А в исправили n на h в строке x0+=h?
0
MaikWazovski
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 7
17.05.2014, 20:45  [ТС] #14
zss, да исправил, только по этому программа стала считать Y нормально, но X возрастает медленно
да и 3 последних Y с минусом, при вводе x0=0 y0=2.7 x=1 h=0.1
0
zss
Модератор
Эксперт С++
6590 / 6152 / 2026
Регистрация: 18.12.2011
Сообщений: 16,041
Завершенные тесты: 1
17.05.2014, 21:17 #15
Цитата Сообщение от MaikWazovski Посмотреть сообщение
но X возрастает медленно
x Обязаны быть 0, 0.1, 0.2 ... 1
0
17.05.2014, 21:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 21:17
Привет! Вот еще темы с ответами:

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

Метод Рунге-Кутта 4 порядка (исправить код) - C++
Всем привет. Нужно решить пример методом Рунге-Кутта 4-го порядка точности. Пример: y=1/2*x*y x0=0 - начало интервала. y0=1 -...

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

Метод Рунге-Кутта 4 порядка для решения системы дифференциальных уравнений - C++
Имеется код программы, но по не очевидным для меня причинам работает не корректно, во время отладки выдает сообщения типа : Run-Time...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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