Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> задача о бросании тела. нужна помощь в решении  
V
    Опции темы
enota
Дата 11.6.2012, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.12.2011

Репутация: нет
Всего: нет



Нужна помощь в решении задачи. 

Тело бросается под углом альфа к горизонту с начальной скоростью  V0. На тело действуют сила тяжести и сила трения о воздух.
Нам были дана две формулы - дискретное решение и аналитическое.  
 Необходимо, чтобы программа строила на одном графике оба решения. 
Задается нами угол, коэффициент трения, начальная скорость, масса тела. 
Аналитическое решение имеет вид:
        xa=(vt/g)*v0*cos(alpha)*(1- exp (-t*(g/vt)));
       ya=(vt/g)*(v0*sin(alpha)+vt)*(1-exp(-(t*g)/vt)-vt*t);
 Вот в нем и состоит проблема. Значения по у-ку считает отрицательными, из-за этого не троит график. Хотя подсчитывала вручную, вроде другие значения. Вот текст программы в Borland C++:



Код

#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <math.h>



double  plot(double m, double c,double  v0,double alpha)

 {

   /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;
   int xmax, ymax;

   /* initialize graphics and local variables */
   initgraph(&gdriver, &gmode, "d:\\borlandc\\bgi");

   /* read result of initialization */
   errorcode = graphresult();
   /* an error occurred */
   if (errorcode != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);
   }

   setcolor(getmaxcolor());
   xmax = getmaxx();
   ymax = getmaxy();

   /* draw a diagonal line */
   //line(0, 0, xmax, ymax);


  int  x0, y0, sx=50, sy=50, i, j, k ;

     // x0=xmax/2;
      y0=ymax/2;



     //osi  koordinat
      // 1 sistema koordinat

      line (5, ymax-5, xmax-5, ymax-5); //Ox
      line (5, y0, 5, ymax-5);          //Oy

      //shtrixi po ox
    for (j=0; j<=xmax/sx; j++)
      { line (5+sx*j, ymax-7,5+sx*j,ymax-3);
        }

     //shtrixi po oy
      for (k=y0/sy; k<=(ymax-5)/sy; k++)
      {line (3, sy*k,7, sy*k);
       }


    //MOE SO4INENIE

       //    const int n=10;
    double vx, vy, x, y, xx, yy, g=9.8, dt=0.005, t, xa, ya, xxa, yya;

    alpha=alpha*0.01745;
    vx=v0*cos(alpha);
    vy=v0*sin(alpha);
    x=0;
    y=0;


      while (y>=0)
    {
      vx=(-(c*dt)/m+1)*vx;
      vy=-g*dt +(-c*dt/m +1)*vy;
      x=dt*vx+x;
      y=dt*vy+y;

      xx=x*sx+5;
      yy=ymax-y*sy-5;
      putpixel(xx, yy, 5);

    }



 double   vt=(m*g)/c;
    t=0;
    int n=10;
    while (n>=0)
     {
       xa=(vt/g)*v0*cos(alpha)*(1- exp (-t*(g/vt)));
       ya=(vt/g)*(v0*sin(alpha)+vt)*(1-exp(-(t*g)/vt)-vt*t);
       t=t+dt;

       n=n-1;
       xxa=xa+5;
       yya=ymax-ya-5;

       cout<<endl<<"   "<<xa<<"\t"<<ya<<"\t"<<xxa<<"\t"<<yya;
       getch();
      putpixel(xxa, yya, 2);

       }


  /* clean up */
   getch();
   closegraph();
   return 0;

  }



    main ()

 {  int om;
    double m, c, v0, alpha;

    clrscr();
  //  while(om!=0)

  //   {
 /*
  cout<<"massa tela m=";
  cin>>m;
  cout<<endl<<"koeffizient trenia c=";
  cin>>c;
  cout<<endl<<"na4alnaia skorost' v0=";
  cin>>v0;
  cout<<endl<<"ygol alpha=";
  cin>>alpha;
  */

  m=20;
  c=30;
  v0=15;
  alpha=70;

  plot (m, c, v0, alpha);

  getch();

//  cout<<"One more? (no-0/yes- any other)";
//  cin>>om;

//  }

  return 0;

  }

PM MAIL   Вверх
feodorv
Дата 11.6.2012, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(enota @  11.6.2012,  21:10 Найти цитируемый пост)
Значения по у-ку считает отрицательными

Формулы аналитического решения и их реализацию в программе проверяли?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
IValdemar
Дата 11.6.2012, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.1.2012

Репутация: нет
Всего: нет



Цитата(enota @  11.6.2012,  20:10 Найти цитируемый пост)
xa=(vt/g)*v0*cos(alpha)*(1- exp (-t*(g/vt)));
       ya=(vt/g)*(v0*sin(alpha)+vt)*(1-exp(-(t*g)/vt)-vt*t);

В ваших формулах alpha в чем подразумевается, в градусах или в радианах?
PM MAIL Skype   Вверх
feodorv
Дата 11.6.2012, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(IValdemar @  12.6.2012,  00:07 Найти цитируемый пост)
В ваших формулах alpha в чем подразумевается, в градусах или в радианах?

Делается преобразование с волшебной константой
Цитата(enota @  11.6.2012,  21:10 Найти цитируемый пост)
   alpha=alpha*0.01745;

которая есть 2*pi/360 smile 

Добавлено @ 23:35
Цитата(enota @  11.6.2012,  21:10 Найти цитируемый пост)
 double   vt=(m*g)/c;

Что есть m и c?

Это сообщение отредактировал(а) feodorv - 11.6.2012, 23:39


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
disputant
Дата 12.6.2012, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Не нравится мне эта формула для y... Хотя бы потому, что в ней размерность не совпадает... Вот это ваше (1-exp(-(t*g)/vt)-vt*t) - вы в нем уверены?
PM MAIL   Вверх
enota
Дата 12.6.2012, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.12.2011

Репутация: нет
Всего: нет



Цитата(feodorv @ 11.6.2012,  23:29)
Цитата(IValdemar @  12.6.2012,  00:07 Найти цитируемый пост)
В ваших формулах alpha в чем подразумевается, в градусах или в радианах?

Делается преобразование с волшебной константой
Цитата(enota @  11.6.2012,  21:10 Найти цитируемый пост)
   alpha=alpha*0.01745;

которая есть 2*pi/360 smile 

Добавлено @ 23:35
Цитата(enota @  11.6.2012,  21:10 Найти цитируемый пост)
 double   vt=(m*g)/c;

Что есть m и c?

m- масса брошенного тела, с - коэффициент трения.

Добавлено через 3 минуты и 44 секунды
Цитата(disputant @ 12.6.2012,  07:23)
Не нравится мне эта формула для y... Хотя бы потому, что в ней размерность не совпадает... Вот это ваше (1-exp(-(t*g)/vt)-vt*t) - вы в нем уверены?

Да, и правда, ошибочка. должна быть такая формула (1-exp(-(t*g)/vt))-vt*t
тогда 
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <math.h>



double  plot(double m, double c,double  v0,double alpha)

 {

   /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;
   int xmax, ymax;

   /* initialize graphics and local variables */
   initgraph(&gdriver, &gmode, "d:\\borlandc\\bgi");

   /* read result of initialization */
   errorcode = graphresult();
   /* an error occurred */
   if (errorcode != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to halt:");
      getch();
      exit(1);
   }

   setcolor(getmaxcolor());
   xmax = getmaxx();
   ymax = getmaxy();

   /* draw a diagonal line */
   //line(0, 0, xmax, ymax);


  int  x0, y0, sx=50, sy=50, i, j, k ;

     // x0=xmax/2;
      y0=ymax/2;



     //osi  koordinat
      // 1 sistema koordinat

      line (5, ymax-5, xmax-5, ymax-5); //Ox
      line (5, y0, 5, ymax-5);          //Oy

      //shtrixi po ox
    for (j=0; j<=xmax/sx; j++)
      { line (5+sx*j, ymax-7,5+sx*j,ymax-3);
        }

     //shtrixi po oy
      for (k=y0/sy; k<=(ymax-5)/sy; k++)
      {line (3, sy*k,7, sy*k);
       }


    //MOE SO4INENIE

       //    const int n=10;
    double vx, vy, x, y, xx, yy, g=9.8, dt=0.005, t, xa, ya, xxa, yya;

    alpha=alpha*0.01745;
    vx=v0*cos(alpha);
    vy=v0*sin(alpha);
    x=0;
    y=0;


      while (y>=0)
    {
      vx=(-(c*dt)/m+1)*vx;
      vy=-g*dt +(-c*dt/m +1)*vy;
      x=dt*vx+x;
      y=dt*vy+y;

      xx=x*sx+5;
      yy=ymax-y*sy-5;
      putpixel(xx, yy, 5);

    }



 double   vt=(m*g)/c;
    t=0;

    while (ya>=0)
     {
       xa=(vt/g)*v0*cos(alpha)*(1- exp (-t*(g/vt)));
       ya=(vt/g)*(v0*sin(alpha)+vt)*(1-exp(-(t*g)/vt))-vt*t;
       t=t+dt;

       xxa=xa+5;
       yya=ymax-ya-5;

            getch();
      putpixel(xxa, yya, 2);

       }


  /* clean up */
   getch();
   closegraph();
   return 0;

  }



    main ()

 {  int om;
    double m, c, v0, alpha;

    clrscr();
  //  while(om!=0)

  //   {
 /*
  cout<<"massa tela m=";
  cin>>m;
  cout<<endl<<"koeffizient trenia c=";
  cin>>c;
  cout<<endl<<"na4alnaia skorost' v0=";
  cin>>v0;
  cout<<endl<<"ygol alpha=";
  cin>>alpha;
  */

  m=20;
  c=30;
  v0=15;
  alpha=70;

  plot (m, c, v0, alpha);

  getch();

//  cout<<"One more? (no-0/yes- any other)";
//  cin>>om;

//  }

  return 0;

  }

Все равно неверно работает. Теперь просто зависает. Около нуля еще что-то строит. 
PM MAIL   Вверх
enota
Дата 12.6.2012, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.12.2011

Репутация: нет
Всего: нет



Всем спасибо. Я решила!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1193 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.