Страница 1 из 1
проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 18 дек 2009, 18:12
настя_87
Для каждого 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;}
получается полный бред,объясните пожалуйста ,что не так...

а ещё может кто-нибудь объяснить пожалуйста возведение в степень...
функция pow,powl,po10,pow10l
мне необходимо найти сумму ((-1)^k)*(x^(2k+1)/(2k+1)!) при (k=o;k<=n;k++) n вводиться с клавиатуры
вот я не понемаю какого типа должен быть каждый элемент в функции для возведения в степень,и какую из них(pow,powl,po10,pow10l) необходимо здесь использовать...и если не трудно,напишите плз какой-нибудь простой пример возведения в степень,чтобы понятнее было

Re: проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 18 дек 2009, 19:00
L.A.V.
Начнем с того что в циклах типа 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); // аналогично
дополнительно посмотреть тут ->
ТЫЦ
и тут ->
ТЫЦ 
Re: проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 18 дек 2009, 19:11
настя_87
=) сама поняла,а потом ещё и ваш пост прочитала =) спасибо =)
хотя у меня было не совсем правильно =/
=) спасибо
Re: проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 18 дек 2009, 19:37
IceFlame
Начнем с того что в циклах типа for счетчиками могут выступать только целочисленные переменные char, short, int, long, и без знаковые целочисленные unsigned (char, short, int, long), но ни в коем случае не вещественные типа float и double.
Глупости. В C++ в цикле for счетчиком может быть что угодно, хоть объект класса.
Re: проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 18 дек 2009, 19:46
L.A.V.
действительно.
во я тупанул конкретно

, Позорище!!!
Прошу извинить что ввел в заблуждение.
Re: проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 18 дек 2009, 19:46
настя_87
Код: Выделить всё
#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 (для тестовых значений исходных данных) должны совпадать в целой части и в первых двух-четырех позициях после десятичной точки.
подскажите плз
Re: проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 18 дек 2009, 20:11
IceFlame
Использование старого кода - это хорошо, но не до такой же степени

Зачем вам 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;
}
Re: проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 18 дек 2009, 20:18
настя_87
блин извиняюсь =) я потеря,наверно не все условия написала :
Для каждого 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 вводятся с клавиатуры.
умоляю помогите исправить код,у меня уже голова взрывается...
Код: Выделить всё
#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;}
формула суммы,вернее сама сумма совсем не равна синусу,оч прошу подскажете что же я сделала не так???
заранее спасибо
у меня уже нервы кончились...
Re: проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 19 дек 2009, 12:40
IceFlame
Во-первых, для каждого числа 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;
}
Re: проблема с возведением в степень "pow" и вычислением синуса икса
Добавлено: 20 дек 2009, 20:07
настя_87
спасибо большое =)