Задача: Итерационные циклы, вычисление знач. функции(ряд) с зад. точно

  • Автор темы Miller85
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

Miller85

#1
Дано задание

1.jpg

Вот такая формула
3.jpg

Не могу понять где ошибка...
Думаю не правильно вычислил бета функцию...(Нигде не могу найти формулу по её точному вычислению)

C++:
#include<iostream.h>
#include<math.h>
#include<stdio.h>
void main()
{
double x,y,eps,a,beta;
int k,n;
cout<<"VVedite x=";
cin>>x;
y=pow(cos(x),3);
cout<<endl<<"Pri x="<<x<<"tochnoe znachenie y="<<y<<endl<<endl;
cout<<"Vvedite eps (conec - 0):";
cin>>eps;
while(eps!=0)
{
for (y=0, n=0, k=1, a=3*(x*x); fabs(a)>=eps&&n<1000;
y+a, n++, beta=(-9.0*(x*x))/(2*k+1)/(k+1), a*=beta, k++);
cout<<"Pri eps="<<eps<<"priblogonnoe znachenie y="<<1-y<<endl
<<"prisumirovanno"<<n<<"chlenov ryada"<<endl<<endl;
cout<<"Vvedite eps (konec - 0):";
cin>>eps;
}
cout<<"Konec programmi. Nagmite Enter.";
getchar();
}
 

Вложения

  • 25.4 КБ Просмотры: 209
  • 4.3 КБ Просмотры: 211

lazybiz

Well-known member
03.11.2010
1 339
0
#2
То ли лыжи не едут... То ли я что-то недопонимаю... Хотя бы откуда ты взял -9.0 ? Почему ты прибавляешь везде единицу я пока вообще спрашивать не хочу...
 
M

Miller85

#3
А разве не надо? Просто из записей в тетради (сделанных на лекциях), Я так понял что надо...
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
Кстати, а почему у тебя eps вводится с клавиатуры несколько раз? Так должно быть?
 
M

Miller85

#5
Я просто не понял как бету найти

Добавлено: Ну что бы ошибку разную задовать каждый раз
так должно быть
 
M

Miller85

#7
бета это beta=(-9.0*(x*x))/(2*k+1)/(k+1)... Вот её я и не могу найти

точнее не понял как найти

её нужно найти из формулы как и а1
 

lazybiz

Well-known member
03.11.2010
1 339
0
#8
Я даже не понял что такое бета...
бета это beta=(-9.0*(x*x))/(2*k+1)/(k+1)...
Удивительно!

Ты же ее только что мне показал.

Добавлено: Учись задавать вопросы правильно!
 

BashOrgRu

Well-known member
15.03.2009
77
0
#9
Типа так надо вычислять твою бета-функцию:

C++:
double step(double x,int s){
unsigned long i;
double pow=1;
for (i=s;i>0;i--) pow*=x;
return pow;
}

unsigned long long factorial(int k){
unsigned long long fac=1,i;
for (i=1;i<=k;i++) fac*=i;
return fac;
}

double GetTeylor(int k,double x){
double a;

a=(k%2==0 ? 1.0 : -1.0); //Знак + или -
a*=(step(3,2*k)+3.0); // (3^2k+3)
a*=step(x,2*k); //x^2k
a=a/factorial(2*k)*1.0; // делим на (2k)!
return a;
}
 

lazybiz

Well-known member
03.11.2010
1 339
0
#10
l1pton17
Что-то ты переколдовал с функцией step ...
Вот так разве не проще:
C++:
double step(double x,int s){
double pow=1;
while ( s-- ) pow*=x;
return pow;
}
 
M

Miller85

#11
Не...Не то... Дано задание...

из формулы
3.jpg

Нужно вручную вычислить а1 и Вк, а потом её уже вставлять в код

вот пример
33.jpg

код
C++:
#include<iostream.h>
#include<math.h>
#include<stdio.h>
void main()
{double x,y,eps,a,beta;
int k,n;
cout<<"Введите x=";
cin>>x;
y=pow(cos(x),2);
cout<<endl<<"При x="<<x<<" точное значение y="<<y<<endl<<endl;
cout<<"Введите eps (конец - 0):";
cin>>eps;
while(eps!=0)
{ for(y=0, n=0, k=1, a=x*x; fabs(a)>=eps&&n<1000; y+=a, n++,
beta =-2*x*x/(2*k+1)/(k+1), a*= beta, k++);
cout<<"При eps="<<eps<<" приближенное значение y="<<1-y<<endl
<<" просуммировано "<<n<<" членов ряда"<<endl<<endl;
cout<<"Введите eps (конец - 0):";
cin>>eps;}
cout<<"Конец программы.Нажмите Enter.";
getchar();
}
 

Вложения

  • 4.3 КБ Просмотры: 170
  • 15.2 КБ Просмотры: 162
M

Miller85

#12
Не могу понять, как вычислить формулу... От куда такое значение Вк?
000.jpg

999.jpg
 

Вложения

  • 16.6 КБ Просмотры: 86
  • 26.3 КБ Просмотры: 146

DarkKnight

Well-known member
01.08.2010
653
0
#13
Никакого Бета тут не надо считать ;-)) Все однозначно
C++:
/*
codeby.net
Autor: DarkKnight125 (Denis Goncharov)
*/
#include <iostream>
#include <iomanip>

using namespace std;

//Функция вычисления факториала (для справки тип long long = __int64)
long long fuct(long long Val)
{
long long Result = 1;
for (long long i = Val; i>0; i--)
Result*= i;
return Result;
}
void main(void)
{
setlocale(LC_ALL,".1251");
double esp;
double x;
cout << "Введите аргумент функции х = ";
cin >> x;
cout<<"Введите точность (ошибку исчислений) : ";
cin >> esp;
double Funct = 0.0;
double Riad = 10.0;
unsigned long k = 0;
while (abs(Riad) > esp) //Пока модуль текущего члена > точности
{
//Вариант с высокой точностью (переполнение наступает значительно позже)
//Принцип не вычислять факториал, а находить частное его членов
double k1 = pow(-1.0,(double)k) * (pow(3.0,(double)2*k)+3); 
for (unsigned long i = 2*k; i>0; i--) //Вот в этом месте
k1 /= (double)i;
Riad = k1 * pow(x,(double)2*k); //Текущий член ряда
//Это я закомментировал... Вариант нахождение с первонач. вычисление факториала, высокая вероятность переполнения
//Riad = pow(-1.0,(double)k) * ((pow(3.0, (double)2*k)+3)/fuct(2*k)) * pow(x,(double)2*k);
Funct+= 1.0/4.0 * Riad; //Наше значение функции
k++;
}
cout<< endl;
cout<< "Значение стандартной функции cos(x)^3 = " << setprecision(12) << pow(cos(x),3.0) << endl;
cout<< "Значение вычисляемого значение Funct = " << setprecision(12)<< Funct << endl;
}
 

Вложения

M

Miller85

#15
Примерно понял... Но в универе мы почему-то в тетради вычисляли а потом вставляли... Просто я на 1-ом курсе и мне навряд ли поверят что это я сделал... Да и на примере код в принципе простой...
Просто не понял как эту б вычислить в ручную... Спасибо большое... Буду думать дальше

Добавлено: Её же вычислили из примера в ручную? Правильно?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#16
А чего ты не понял? Все очень просто:
C++:
double func_a( double x )
{
// уже Кнайт объяснил как считать...
}

double func_b( double k )
{
return (func_a( k + 1 )) / func_a( k );
}
 
M

Miller85

#17
Просто сравнивая код Кнайта и код примера :) разница на лицо! не поверят... Для 1-ого курса слишком круто будет
 

DarkKnight

Well-known member
01.08.2010
653
0
#18
Miller85 , для первого курса как раз само то ;-)) Это уже для 3-5ого круто ;-) Там народ математику уже забывать начинает просто ;-)
 
M

Miller85

#19
Извини за глупый вопрос... Почему такая разница между кодами? :what?:
 

DarkKnight

Well-known member
01.08.2010
653
0
#20
Между какими именно ? ;-)) Тут их в теме как никогда очень много ;-)))
 
Статус
Закрыто для дальнейших ответов.