• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

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

Miller85

Дано задание

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();
}
 
L

lazybiz

То ли лыжи не едут... То ли я что-то недопонимаю... Хотя бы откуда ты взял -9.0 ? Почему ты прибавляешь везде единицу я пока вообще спрашивать не хочу...
 
M

Miller85

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

lazybiz

Кстати, а почему у тебя eps вводится с клавиатуры несколько раз? Так должно быть?
 
M

Miller85

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

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

Miller85

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

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

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

lazybiz

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

Вот её я и не могу найти
Ты же ее только что мне показал.

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

BashOrgRu

Типа так надо вычислять твою бета-функцию:

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;
}
 
L

lazybiz

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

Miller85

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

из формулы
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();
}
 
D

DarkKnight

Никакого Бета тут не надо считать ;-)) Все однозначно
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;
}
 

Вложения

  • cos_3_.jpg
    cos_3_.jpg
    21,7 КБ · Просмотры: 534
M

Miller85

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

Добавлено:
Это просто функция B от k.

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

lazybiz

А чего ты не понял? Все очень просто:
C++:
double func_a( double x )
{
// уже Кнайт объяснил как считать...
}

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

Miller85

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

DarkKnight

Miller85 , для первого курса как раз само то ;-)) Это уже для 3-5ого круто ;-) Там народ математику уже забывать начинает просто ;-)
 
D

DarkKnight

Между какими именно ? ;-)) Тут их в теме как никогда очень много ;-)))
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!