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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2011, 13:30   #1
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию мой метод Эйлера

Здравствуйте. Вот реализовал метод Эйлера для решения конкретного уравнения. Но не могу оценить правильность работы программы.
Подскажите пожалуйста:
1)Правильно ли я реализовал метод
2)Может можно реализовать красивее
3) Что можно исправить если неверно
4) Подскажите решение моего уравнения, что бы сравнить.

Вот уравнение: у' = 6*x^2+5*x*y+y^2+4*x+2*y-3

Вот код:
Код:
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;

int main(int argc, char *argv[])
{
    int i,n; float x,y,dy,h,f;
    cout<< " h = ";cin>>h;
    cout<< " n = ";cin>>n;
    cout<< " x0 = ";cin>>x;
    cout<< " y0 = ";cin>>y;
    for (i=0;i<=n;i++)
     {
       f=(6*x*x+5*x*y+y*y+4*x+2*y-3);
       x=x+(i*h);
       dy=h*f;
       y=y+dy;
     cout <<"y = "<<y;
      cout<< " x = "<<x;
      }
    system("PAUSE");
    return EXIT_SUCCESS;
}
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Старый 20.05.2011, 19:56   #2
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

И еще подскажите пожалуйста как переделать в модифицированный метод эйлера
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Старый 21.05.2011, 22:45   #3
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

50 просмотров и не одного ответа...
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Старый 22.05.2011, 14:42   #4
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
1)Правильно ли я реализовал метод
2)Может можно реализовать красивее
3) Что можно исправить если неверно
Только x=x+(i*h); не надо - вы увеличиваете длину шага на каждой итерации.
И вадайте вынесем заданную функцию (6*x^2+5*x*y+y^2+4*x+2*y-3) в отдельную функцию (myfunc).

Код:
#include <cstdlib>
#include <iostream>
#include <math.h>

using namespace std;

double myfunc(const double& x, const double& y)
{
	return 6*x*x+5*x*y+y*y+4*x+2*y-3;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int i, n; 
    double x, y, h;

    cout<< " h = "; cin>>h;
    cout<< " n = "; cin>>n;
    cout<< " x0 = "; cin>>x;
    cout<< " y0 = "; cin>>y;

    for (i = 0; i <= n; i++)
    {
        y += h * myfunc(x, y);
		
        cout << "y = " << y;
        cout << "   x = " << x << "\n";

        x += h;
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}
Цитата:
Но не могу оценить правильность работы программы.
Для этого возьмите известную функцию, и проверьте по ней.
Или найдите в интернете пример функции (пример).
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 22.05.2011 в 16:47.
Daramant вне форума Ответить с цитированием
Старый 22.05.2011, 14:53   #5
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
И еще подскажите пожалуйста как переделать в модифицированный метод эйлера
Там же почти то же самое (метод Эйлера):
Код:
	...
	for (i = 0; i <= n; i++)
	{
		fy = myfunc(x, y);
		py = y + h * fy;
		y += h / 2 * (fy + myfunc(x, py));
		
		cout << "y = " << y;
		cout << "   x = " << x << "\n";

		x += h;
	}
	...
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 22.05.2011, 23:07   #6
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Компилятор выдает ошибки в строке
int _tmain(int argc, _TCHAR* argv[])

заменил так:

int main(int argc, char *argv[])


Работает.

Модифицированный метод не пашет. Ошибки в строке:
fy = myfunc(x, y);

пока не пойму.
py я объявил как дабл.
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Старый 22.05.2011, 23:14   #7
nikozavr
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 140
По умолчанию

Дятел. фу забыл объявить. Все работает. Спасибо.
Хочу шарить как Daramant!!!
nikozavr вне форума Ответить с цитированием
Старый 23.12.2011, 15:32   #8
Barabulka
 
Регистрация: 23.12.2011
Сообщений: 5
По умолчанию

у меня дифур ds/dx=s, в аналитическом решении должно получится exp(s), однако на деле и близко и не стоит. По шагам посмотрел, аппроксимация выполняется правильно. Производная простая в функцию выносить не стал. Если честно, код наверху не совсем понял.. Видимо у меня компилятор другой
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
void main()
{
	float x,S0,S1,S2,x0,e,x1,dx;
	long N,i;
	printf(" nachalnie t0, x0, tochonst' e, nuznaia tochka x");
	scanf("%f %f %f %f", &x0, &S0, &e, &x1);
	N=1000000;
	dx=((x1-x0)/N);
	S1=100500;
	S2=0;
	while((S1-S2)>e)
	{
		S1=S0;
		x=x0;
	   for(i=0;i<N;i++)
	   {
		  S1=S1+dx*x;
		  x=x+dx;
	   }
	    S2=S0;
		x=x0;
	   for(i=0;i<2*N;i++)
	   {
		  S2=S2+dx/2*x;
		  x=x+dx/2;
	   }
	   dx=dx/2;
	   N=abs((x1-x0)/dx);
	}
	N=abs((x1-x0)/dx);
	S1=S0;
	x=x0;
	for(i=0;i<N;i++)
	{
		S1=S1+dx*x;
		x=x+dx;
	}
	printf("%f", S1);
	getch();
}

Последний раз редактировалось Barabulka; 23.12.2011 в 17:11.
Barabulka вне форума Ответить с цитированием
Старый 23.12.2011, 18:04   #9
Barabulka
 
Регистрация: 23.12.2011
Сообщений: 5
По умолчанию

ох я оказывается связал с производной аргумент вместо значения, извиняюсь всё работает
Barabulka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Эйлера Anubys Общие вопросы C/C++ 2 17.05.2011 16:51
Метод Эйлера RoKSport Паскаль, Turbo Pascal, PascalABC.NET 5 12.02.2011 12:45
Метод Рунге Кутты и Эйлера Nikolai17 Помощь студентам 1 20.05.2010 11:42
Метод Эйлера и Рунге-Кута HECTOR.A. Помощь студентам 0 11.05.2009 16:24