проблема с возведением в степень "pow" и вычислением синуса икса

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
настя_87
Сообщения: 10
Зарегистрирован: 17 дек 2009, 15:38

Для каждого x, изменяющегося от a до b с шагом h, найти значения функции Y(x)=sin(x)

Код: Выделить всё

#include <iostream.h>
#include <math.h>
#include <Math.hpp>
using namespace std;
int main()
{double a=0,b=0,h,i;
cout<<"Vvedite neobhodimie dlya reweniya elementi...\n";
cout<<"a:"<<endl;
cin>>a;
cout<<"b:"<<endl;
cin>>b;
cout<<"h:"<<endl;
cin>>h;
//cout<<"n:"<<endl;
//cin>>n;
i=a;
do{
     cout<<"y = "<<sin(i)<<endl;
        i+=h;

  }
  while(i!=b);
return 0;}
получается полный бред,объясните пожалуйста ,что не так... :confused:
а ещё может кто-нибудь объяснить пожалуйста возведение в степень...
функция pow,powl,po10,pow10l
мне необходимо найти сумму ((-1)^k)*(x^(2k+1)/(2k+1)!) при (k=o;k<=n;k++) n вводиться с клавиатуры
вот я не понемаю какого типа должен быть каждый элемент в функции для возведения в степень,и какую из них(pow,powl,po10,pow10l) необходимо здесь использовать...и если не трудно,напишите плз какой-нибудь простой пример возведения в степень,чтобы понятнее было :rolleyes:
L.A.V.
Сообщения: 20
Зарегистрирован: 16 авг 2009, 23:37
Откуда: Солнечный Крым
Контактная информация:

Начнем с того что в циклах типа for счетчиками могут выступать только целочисленные переменные char, short, int, long, и без знаковые целочисленные unsigned (char, short, int, long), но ни в коем случае не вещественные типа float и double.

Если же по условию задачи требуется, то для твоего случая это возможно реализовать с помощью цикла while так:

Код: Выделить всё

x = a;
while(x <= b) 
{
  double y = sin(x);
  cout<< "sin(x) = "<< y << endl;
  x += h; // увеличиваем x на заданный шаг
}

Что касается функции pow то вот все ее прототипы:

Код: Выделить всё

double pow (double base, double exponent );
long double pow ( long double base, long double exponent );
float pow (float base, float exponent );
double pow (double base, int exponent );
long double pow ( long double base, int exponent ); 
примеры вызова:
double result; //результат
result = pow(5, 6); //5 в степени 6
result = pow(6.33, 3.33); // аналогично

дополнительно посмотреть тут -> ТЫЦ
и тут -> ТЫЦ :)
настя_87
Сообщения: 10
Зарегистрирован: 17 дек 2009, 15:38

=) сама поняла,а потом ещё и ваш пост прочитала =) спасибо =)
хотя у меня было не совсем правильно =/
=) спасибо
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Начнем с того что в циклах типа for счетчиками могут выступать только целочисленные переменные char, short, int, long, и без знаковые целочисленные unsigned (char, short, int, long), но ни в коем случае не вещественные типа float и double.
Глупости. В C++ в цикле for счетчиком может быть что угодно, хоть объект класса.
L.A.V.
Сообщения: 20
Зарегистрирован: 16 авг 2009, 23:37
Откуда: Солнечный Крым
Контактная информация:

действительно.
во я тупанул конкретно :) , Позорище!!!

Прошу извинить что ввел в заблуждение.
настя_87
Сообщения: 10
Зарегистрирован: 17 дек 2009, 15:38

Код: Выделить всё

#include <iostream.h>
#include <math.h>
#include <Math.hpp>
using namespace std;
int main()
{double a=0,b=0,h=0,n=0,k=0,m=1,x=0,s=0,z=0,l;
cout<<"Vvedite neobhodimie dlya reweniya elementi...\n";
cout<<"a:"<<endl;
cin>>a;
cout<<"b:"<<endl;
cin>>b;
cout<<"h:"<<endl;
cin>>h;
cout<<"n:"<<endl;
cin>>n;
x = a;
while
((x <= b)&&
(k < n))
{
  s+=(pow(-1,k))*(pow(x,(2*k+1)))/m*(2*k+1);
  double y = sin(x);
  z=fabs(s-y);
  cout<< "sin(x)     =    | "<< y << endl;
  cout<< "s(x)      =     | "<< s << endl;
  cout<< "|s(x)-sin(x)| = | "<< z <<endl;
  cout<<"------------------------------------------"<<endl;
  x += h;
  k++;
  m=(2*k+1);
}
cin>>l;
return 0;}
подскажите ,что не так в описании суммы "s"?
мне необходимо найти сумму ((-1)^k)*(x^(2k+1)/(2k+1)!) при (k=o;k<=n;k++)
сказано что сумма s(x) и sin(x) должны быть почти одинаковы... у меня далеко до похожести даже %)))
вот что сказано в условии:
при правильном решении значения S и Y для заданного аргумента x (для тестовых значений исходных данных) должны совпадать в целой части и в первых двух-четырех позициях после десятичной точки.
подскажите плз
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Использование старого кода - это хорошо, но не до такой же степени :)
Зачем вам b и h? Вот мой рабочий вариант

Код: Выделить всё

#include <iostream.h>
#include <math.h>
#include <Math.hpp>

using namespace std;
int main()
{
double x=0,n=0,k=0,m=1,s=0;
cout<<"Vvedite neobhodimie dlya reweniya elementi...\n";
cout<<"x:"<<endl;
cin>>x;
cout<<"n:"<<endl;
cin>>n;
for(;k<=n;k++)
{
  s+=pow(-1,k)*pow(x,(2*k+1))/m;
  m*=(2*k+2)*(2*k+3); //считаем факториал в знаменателе
}
cout<< "Real sin(x) = "<< sin(x) << endl; //настоящий синус
cout<< "Estimate sin(x) = "<< s << endl; //разложенный в ряд
cin>>x;
return 0;
}
настя_87
Сообщения: 10
Зарегистрирован: 17 дек 2009, 15:38

блин извиняюсь =) я потеря,наверно не все условия написала :
Для каждого x, изменяющегося от a до b с шагом h, найти значения функции Y(x), суммы S(x)=((-1)^k)*(x^(2k+1)/(2k+1)!) при (k=o;k<=n;k++) и |Y(x)–S(x)| и вывести в виде таблицы. Значения a, b, h и n вводятся с клавиатуры.
умоляю помогите исправить код,у меня уже голова взрывается... :mad:

Код: Выделить всё

#include <iostream.h>
#include <math.h>
#include <Math.hpp>

using namespace std;
unsigned long fact(unsigned long n)
{
if (n <= 1)
return 1;
else
return n * fact(n - 1);
}

int main()
{double a=0,b=0,h=0,n=0,k=0,m=1,x=0,s=0,z=0,l;
cout<<"Vvedite neobhodimie dlya reweniya elementi...\n";
cout<<"a:"<<endl;
cin>>a;
cout<<"b:"<<endl;
cin>>b;
cout<<"h:"<<endl;
cin>>h;
cout<<"n:"<<endl;
cin>>n;
x = a;
do
{
m=2*k+1;
 s+=pow(-1,k)*pow(x,(2*k+1))/fact(m);
  double y = sin(x);
  z=fabs(y-s);
  cout<< "sin(x)     =    | "<< y << endl;
  cout<< "s(x)      =     | "<< s << endl;
  cout<< "|s(x)-sin(x)| = | "<< z <<endl;
  cout<<"------------------------------------------"<<endl;
  x += h;
  k++;

}
while ((x <= b)&&(k < n));
cin>>l;
return 0;}
формула суммы,вернее сама сумма совсем не равна синусу,оч прошу подскажете что же я сделала не так???
заранее спасибо
у меня уже нервы кончились...
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Во-первых, для каждого числа x надо заново считать сумму ряда. То есть должен быть еще один вложенный цикл.
Во-вторых, использование unsigned long для факториала не очень хорошо, так как уже 13! выйдет за его границы и в результате будет получаться ерунда. Кстати, если уж делите на целое число в надежде получить число вещественное, то на всякий случай приведите целое число к вещественному (double)fact(m).
В-третьих каждый раз считать заново факториал, да еще и рекурсивной функцией - не очень хорошая затея.
В-общем, мой вариант:

Код: Выделить всё

#include <iostream.h>
#include <math.h>
#include <Math.hpp>

using namespace std;


int main()
{
double a=0,b=0,h=0,n=0,k=0,m=1,x=0,s=0,z=0,l;
cout<<"Vvedite neobhodimie dlya reweniya elementi...\n";
cout<<"a:"<<endl;
cin>>a;
cout<<"b:"<<endl;
cin>>b;
cout<<"h:"<<endl;
cin>>h;
cout<<"n:"<<endl;
cin>>n;
x = a;
do
{
  for(k=0,s=0,m=1;k<n;k++)
  {
      s+=pow(-1,k)*pow(x,(2*k+1))/m;
      m*=(2*k+3)*(2*k+2);
  }
  double y = sin(x);
  z=fabs(y-s);
  cout<< "sin(" <<x << ")     =    | "<< y << endl;
  cout<< "s(" <<x << ")      =     | "<< s << endl;
  cout<< "|s(" <<x << ")-sin(" <<x << ")| = | "<< z <<endl;
  cout<<"------------------------------------------"<<endl;
  x += h;

}
while (x <= b);
cin>>l;
return 0;
}
настя_87
Сообщения: 10
Зарегистрирован: 17 дек 2009, 15:38

спасибо большое =)
Ответить