1 Востаннє редагувалося Mafia (23.10.2013 22:46:42)

Тема: Поможіть обчислити значення виразу

Привіт товариство,тут мені дали досить складне завдання поможіть,мені потрібно реалізувати програму на С++,яка б За дійсними числами e>0 i t обчислити з точністю e велечину
http://latex.codecogs.com/gif.latex?\sqrt[4]{1-\frac{cos^{4}(t)}{4}&space;}&space;+\sqrt[5]{1+\frac{arctg(t)}{2}&space;}*\sqrt[9]{\frac{1}{3+t^{2}}}
для обчислення коренів використати ряд Тейлора:
http://latex.codecogs.com/gif.latex?(1+x)^a=1+a*x/11+a*(a-1)*x^2/21+a*(a-1)*(a-2)*x^3/31+...
де
http://latex.codecogs.com/gif.latex?(\left&space;|&space;x&space;\right&space;|\leq&space;1,a>0).
дякую за можливу допомогу
просто в інтернеті є приклади реалізації для sin наприклад,а тут сума та щей й добуток,тому то я завис

2

Re: Поможіть обчислити значення виразу

А в чому проблеми? Щось вже написали? Почніть з функції обчислення кореня за допомогою ряда Тейлора. Назву теми краще перейменуйте в щось типу "Обчислення значення виразу" згідно правил.

3

Re: Поможіть обчислити значення виразу

Викладати посилання на зображення... зображенням - це вже сильно. Можна було б ще сфотографувати на плівочне фото, роздрукувати, надіслати факсом, результат відксерити і відсканувати. Так надійніше.
Ну і

правила читали?
http://s018.radikal.ru/i504/1305/4e/128b3beefcef.jpg
Подякували: Mafia1

4 Востаннє редагувалося Mafia (23.10.2013 23:15:00)

Re: Поможіть обчислити значення виразу

koala написав:

Викладати посилання на зображення... зображенням - це вже сильно. Можна було б ще сфотографувати на плівочне фото, роздрукувати, надіслати факсом, результат відксерити і відсканувати. Так надійніше.
Ну і

Я не прошу вас написати мені код,я хочу почути поради як це реалізувати,де прочитати реалізацію чогось подібного.

Під час створення теми я мусів відлучитись тому спочатку натупув трохи з фотками :)

5

Re: Поможіть обчислити значення виразу

Питання: якого рівня завдання? Звичайна лабораторна на чомусь не дуже математичному, чи курсова з вимогою доводити строгість всіх висновків? Бо в першому випадку достатньо буде обчислити кожний вираз, доки черговий член не стане меншим за E/3, а в другому, як ми вчили

Жінкам, дітям і русофобам не читати!

Член какой придется впору,
Чтобы вставить в зад Тейлору?
Оба члена хороши -
И Лагранжа и Коши!
Подякували: Chemist-i, Mafia, leofun013

6 Востаннє редагувалося Mafia (24.10.2013 00:09:44)

Re: Поможіть обчислити значення виразу

koala написав:

Питання: якого рівня завдання? Звичайна лабораторна на чомусь не дуже математичному, чи курсова з вимогою доводити строгість всіх висновків? Бо в першому випадку достатньо буде обчислити кожний вираз, доки черговий член не стане меншим за E/3, а в другому, як ми вчили

Це скоріше всього перший,ти пропонуєш пройти кожен з трьох коренів таку процедуру:
використавши ряд Тейлора додавати елементи поки один з них не буде менший e/3;
Питання:
1)Чому саме e/3?;
2) там другий доданок є добутком,наскільки я знаю це вплине на точність якщо їх помножити;
3)Хватить точності double?Просто,якщо вибрати велике e, то програма просто округлить його
значення одного з доданків до 1 і по всьому,можна вирішити таке питання?чи я тут помиляюсь?

7 Востаннє редагувалося koala (24.10.2013 09:28:54)

Re: Поможіть обчислити значення виразу

Mafia написав:

1)Чому саме e/3?; 2) там другий доданок є добутком,наскільки я знаю це вплине на точність якщо їх помножити;

Бо спати вчора хотів. Сьогодні прочитав, так самому соромно стало.
http://latex.codecogs.com/gif.download?%28A+%5Cvarepsilon_%7BA%7D%29+%28B+%5Cvarepsilon_%7BB%7D%29%28C+%5Cvarepsilon_%7BC%7D%29%3DA+BC+%5Cvarepsilon_%7BA%7D+B%5Cvarepsilon_%7BC%7D+C%5Cvarepsilon_%7BB%7D+%5Cvarepsilon_%7BB%7D%5Cvarepsilon_%7BC%7D
Останній член достатньо малий, а от для решти має бути (з урахуванням того, що відхилення можуть бути з різними знаками)
http://latex.codecogs.com/gif.latex?%5Cvarepsilon%3E%5Cleft%20%7C%5Cvarepsilon_%7BA%7D%5Cright%20%7C+%5Cleft%20%7CB%5Cvarepsilon_%7BC%5Cright%20%7C%7D+%5Cleft%20%7CC%5Cvarepsilon_%7BB%5Cright%20%7C%7D
Ось це і є ваша умова (ε -задана похибка, ε з індексом - відхилення відповідного виразу).

Mafia написав:

3)Хватить точності double?Просто,якщо вибрати велике e, то програма просто округлить його
значення одного з доданків до 1 і по всьому,можна вирішити таке питання?чи я тут помиляюсь?

Помиляєтеся, хоча й точно не скажу, у чому, бо не зрозумів, що ви хочете сказати. У double є своя точність, у float - своя, і ця точність обмежує певним чином ε знизу, але якщо брати ε 0,001-0,0001, то й float буде досить. float зберігає 7-8 десятичних знаків числа, double - 15-16.

Подякували: Mafia1

8 Востаннє редагувалося Mafia (24.10.2013 22:02:03)

Re: Поможіть обчислити значення виразу

koala написав:
Mafia написав:

1)Чому саме e/3?; 2) там другий доданок є добутком,наскільки я знаю це вплине на точність якщо їх помножити;

Бо спати вчора хотів. Сьогодні прочитав, так самому соромно стало.
http://latex.codecogs.com/gif.download?%28A+%5Cvarepsilon_%7BA%7D%29+%28B+%5Cvarepsilon_%7BB%7D%29%28C+%5Cvarepsilon_%7BC%7D%29%3DA+BC+%5Cvarepsilon_%7BA%7D+B%5Cvarepsilon_%7BC%7D+C%5Cvarepsilon_%7BB%7D+%5Cvarepsilon_%7BB%7D%5Cvarepsilon_%7BC%7D
Останній член достатньо малий, а от для решти має бути (з урахуванням того, що відхилення можуть бути з різними знаками)
http://latex.codecogs.com/gif.latex?%5Cvarepsilon%3E%5Cleft%20%7C%5Cvarepsilon_%7BA%7D%5Cright%20%7C+%5Cleft%20%7CB%5Cvarepsilon_%7BC%5Cright%20%7C%7D+%5Cleft%20%7CC%5Cvarepsilon_%7BB%5Cright%20%7C%7D
Ось це і є ваша умова (ε -задана похибка, ε з індексом - відхилення відповідного виразу).

будь ласка,як визначити Ea,Eb,Ec Бо я просто не зрозумів

koala написав:
Mafia написав:

3)Хватить точності double?Просто,якщо вибрати велике e, то програма просто округлить його
значення одного з доданків до 1 і по всьому,можна вирішити таке питання?чи я тут помиляюсь?

Помиляєтеся, хоча й точно не скажу, у чому, бо не зрозумів, що ви хочете сказати. У double є своя точність, у float - своя, і ця точність обмежує певним чином ε знизу, але якщо брати ε 0,001-0,0001, то й float буде досить. float зберігає 7-8 десятичних знаків числа, double - 15-16.

чому якщо просто обрахувати один з доданків,то він виходить один?

9 Востаннє редагувалося koala (24.10.2013 23:56:23)

Re: Поможіть обчислити значення виразу

Mafia написав:

будь ласка,як визначити Ea,Eb,Ec Бо я просто не зрозумів

Зазвичай беруть останній член рядку за похибку. Це не зовсім точно (точніше буде погратися з остаточними членами за посиланнями), але на практиці себе виправдовує.

Mafia написав:

чому якщо просто обрахувати один з доданків,то він виходить один?

Спробуйте переформулювати питання, додати приклад, можливо. Бо я не знаю, як відповідати на питання "чому якщо просто зробити X, то воно буде X", щоб не образити того, хто питав.

Подякували: Mafia1

10

Re: Поможіть обчислити значення виразу

koala написав:
Mafia написав:

будь ласка,як визначити Ea,Eb,Ec Бо я просто не зрозумів

Зазвичай беруть останній член рядку за похибку. Це не зовсім точно (точніше буде погратися з остаточними членами за посиланнями), але на практиці себе виправдовує.

Mafia написав:

чому якщо просто обрахувати один з доданків,то він виходить один?

Спробуйте переформулювати питання, додати приклад, можливо. Бо я не знаю, як відповідати на питання "чому якщо просто зробити X, то воно буде X", щоб не образити того, хто питав.

дай будь ласка свій скайп,я задам декілька питань стосовно алгоритму,програму я сам напишу

11

Re: Поможіть обчислити значення виразу

Ставте питання тут (п. 3.8 Правил).

Подякували: Replace, Mafia2

12 Востаннє редагувалося Mafia (28.10.2013 20:10:47)

Re: Поможіть обчислити значення виразу

koala написав:

Ставте питання тут (п. 3.8 Правил).

ось код що я написав,думки нище

//Обичслення виразу з е точнісю
#include <iostream>
#include <cmath>

using namespace std;

double f1(double);
double f2(double);
double f3(double);
double row_element(unsigned,double,double);
int main()
{
    double e,t;
    cin>>e>>t;
}

// тут функції для обрахунку x в рярі тейлора
// (1+x)^a (в третьому звів до такого вигляду)
double f1(double x)
{
    return -1*pow(cos(x),4)/4;
}
double f2(double x)
{
    return atan(x)/2;
}
double f3(double x)
{
    return -1*(x*x+2)/(x*x+3);
}
// функція для обрахунку і-го(i>1) члена ряда тейлора
// x,a-це звідси (1+x)^a 
double row_element(unsigned i,double x,double a)
{
    double temp=1;
    for (unsigned j=0;j<i;++j){
        temp*=a-j-1;
    }
    return (temp*x)/(10*i+1);
}

чи я зрозумів ваш алгоритм
Обчислюємо значення 0-го елемента ряда Тейлора для f1,f2,f3 і дістаємо Ea=1,Eб=1,Ec=1 -відповідно =>
=>далі обчислюємо e>|Ea|+|Ec*f2|+|Eб*f3|(запам'ятовуємо його нехай x(0)),якщо true то виводимо x,як результат,якщо false то =>=>Обчислюємо значення i-го елемента для f1,f2,f3 і дістаємо Ea,Eб,Ec - відповідно=>
=>далі обчислюємо e>|Ea|+|Ec*f2|+|Eб*f3|(запам'ятовуємо його x(i)),якщо true то Відповідь:x(i)+x(i-1),якщо false =>=> продовжуємо описаний процес

в результаті отримаємо відповідь x(i)+x(i-1)

я правильно вас зрозумів?

13

Re: Поможіть обчислити значення виразу

koala написав:
Mafia написав:

чому якщо просто обрахувати один з доданків,то він виходить один?

Спробуйте переформулювати питання, додати приклад, можливо. Бо я не знаю, як відповідати на питання "чому якщо просто зробити X, то воно буде X", щоб не образити того, хто питав.

Тут ви напевно мене неправильно зрозуміли,вибачте

14

Re: Поможіть обчислити значення виразу

Не зовсім так. В якості оцінки похибок будемо користуватися останнім членом ряду Тейлора. Позначимо, щоб не плутатися, A(i) - i-е наближення 1-го кореня, a(i) - i-й член ряду Тейлора для 1-го кореня, відповідно A(i)=a(1)+a(2)+...+a(i). Тоді на i-му кроці перевіряємо
e>|a(1)|+|B(i)*с(i)|+|C(i)*b(i)|
і якщо це не виконується - збільшуємо i.
Ми тут припускаємо, що i-й член ряду більший за суму всіх членів за ним, а i-а сума досить близька до реального значення, щоб похибка другого порядку не вплинула на відхилення. На практиці воно десь так і виходить.

Подякували: Mafia1

15 Востаннє редагувалося Mafia (29.10.2013 00:25:55)

Re: Поможіть обчислити значення виразу

koala написав:

Не зовсім так. В якості оцінки похибок будемо користуватися останнім членом ряду Тейлора. Позначимо, щоб не плутатися, A(i) - i-е наближення 1-го кореня, a(i) - i-й член ряду Тейлора для 1-го кореня, відповідно A(i)=a(1)+a(2)+...+a(i). Тоді на i-му кроці перевіряємо
e>|a(1)|+|B(i)*с(i)|+|C(i)*b(i)|
і якщо це не виконується - збільшуємо i.
Ми тут припускаємо, що i-й член ряду більший за суму всіх членів за ним, а i-а сума досить близька до реального значення, щоб похибка другого порядку не вплинула на відхилення. На практиці воно десь так і виходить.

за B(1)-взяти b(1),а за С(1)-взяти с(1)
після виходи з циклу,за відповідь взяти A(i)?
де тут є 1-ця що є в рядах тейлора?

//Обичслення виразу з е точнісю
#include <iostream>
#include <cmath>

using namespace std;

double f1(double);
double f2(double);
double f3(double);
double rowElement(unsigned,double,double);
int main()
{
    setlocale(LC_ALL,"");
    double e,t;
    cout<<"Введiть похибку\n";
    cin>>e;
    cout<<"Введiть t\n";
    cin>>t;
    double value=0;
    double A=1,B=1,C=1;
    double tempA,tempB,tempC;
    double answer;
    int i=0;
    do{
        ++i;
        tempA=rowElement(i,f1(t),1/4);
        tempB=rowElement(i,f2(t),1/5);
        tempC=rowElement(i,f3(t),1/9);
        A+=tempA;
        B+=tempB;
        C+=tempC;
        cout<<abs(tempA)+abs(B*tempC)+abs(C*tempB)<<endl;
    }
    while(e<abs(tempA)+abs(B*tempC)+abs(C*tempB));
    cout<<endl;
    cout<<A+B*C;
    cout<<endl;
    system("PAUSE");
}

// тут функції для обрахунку x в рярі тейлора
// (1+x)^a (в третьому звів до такого вигляду)
double f1(double x)
{
    return -1*pow(cos(x),4)/4;
}
double f2(double x)
{
    return atan(x)/2;
}
double f3(double x)
{
    return -1*(x*x+2)/(x*x+3);
}
// функція для обрахунку і-го(i>1) члена ряда тейлора
// x,a-це звідси (1+x)^a 
double rowElement(unsigned i,double x,double a)
{
    double temp=1;
    for (unsigned j=0;j<i;++j){
        temp*=a-j-1;
    }
    return (temp*x)/(10*i+1);
}

abs(tempA)+abs(B*tempC)+abs(C*tempB) - ЗРОСТАЄ,програма не виходить з циклу.

16

Re: Поможіть обчислити значення виразу

О, я нарешті зрозумів, про яку ви одиницю кажете. Ну так, виходить, перше наближення - 1 (враховуйте, що |x|<=1 - так досить непогане наближення для першої ітерації).
І в знаменниках в ряді Тейлора не 11, 21, 31, а 1!, 2!, 3! - факторіали.
А за відповідь взяти, вочевидь, A(i)+B(i)*C(i) :)

Подякували: Mafia1

17

Re: Поможіть обчислити значення виразу

koala написав:

І в знаменниках в ряді Тейлора не 11, 21, 31, а 1!, 2!, 3! - факторіали.

я то думаю шо щось на біном нютона не похоже.
запустіть цю програму,в мене вираз в умові прямує до+inf
не знаю в чому проблема

//Обичслення виразу з е точнісю
#include <iostream>
#include <cmath>

using namespace std;

double f1(double);
double f2(double);
double f3(double);
double rowElement(unsigned,double,double);
 int Factorial(int x) {
  return (x == 1 ? x : x * Factorial(x - 1));
}
int main()
{
    setlocale(LC_ALL,"");
    double e,t;
    cout<<"Введiть похибку\n";
    cin>>e;
    cout<<"Введiть t\n";
    cin>>t;
    double value=0;
    double A=1,B=1,C=1;
    double tempA,tempB,tempC;
    double answer;
    int i=0;
    do{
        ++i;
        tempA=rowElement(i,f1(t),1/4);
        tempB=rowElement(i,f2(t),1/5);
        tempC=rowElement(i,f3(t),1/9);
        A+=tempA;
        B+=tempB;
        C+=tempC;
        cout<<abs(tempA)+abs(B*tempC)+abs(C*tempB)<<endl;
    }
    while(e<abs(tempA)+abs(B*tempC)+abs(C*tempB));
    cout<<endl;
    cout<<A+B*C;
    cout<<endl;
    system("PAUSE");
}

// тут функції для обрахунку x в рярі тейлора
// (1+x)^a (в третьому звів до такого вигляду)
double f1(double x)
{
    return -1*pow(cos(x),4)/4;
}
double f2(double x)
{
    return atan(x)/2;
}
double f3(double x)
{
    return -1*(x*x+2)/(x*x+3);
}
// функція для обрахунку і-го(i>1) члена ряда тейлора
// x,a-це звідси (1+x)^a 
double rowElement(unsigned i,double x,double a)
{
    double temp=1;
    for (unsigned j=0;j<i;++j){
        temp*=a-j-1;
    }
    return (temp*x)/Factorial(i);
}

18 Востаннє редагувалося koala (29.10.2013 12:55:29)

Re: Поможіть обчислити значення виразу

1. Перевірте формулу для rowElement. Підставте i=0, i=1. Придивіться до формули Тейлора - там нічого не загубили?
2. Так, як ви робите, ви отримаєте дуже великі числівник і знаменник. Внесіть факторіал в цикл.

Подякували: Mafia1

19

Re: Поможіть обчислити значення виразу

koala написав:

1. Перевірте формулу для rowElement. Підставте i=0, i=1. Придивіться до формули Тейлора - там нічого не загубили?
2. Так, як ви робите, ви отримаєте дуже великі числівник і знаменник. Внесіть факторіал в цикл.

1.Перевірив була помилка з переведенням типів
2.Тут я вас не зрозумів,ми рахуємо елемент ряда,поділивши його на факторіал,в любому випадку ми будем ділити його на факторіал чи в функції чи в циклі не має значення,чи я щось не зрозумів
ось виправлений код,але проблема цяж сама

//Обичслення виразу з е точнісю
#include <iostream>
#include <cmath>

using namespace std;

long double f1(long double);
long double f2(long double);
long double f3(long double);
long double rowElement(unsigned,long double,long double);
 int Factorial(int x) {
  return (x == 1 ? x : x * Factorial(x - 1));
}
int main()
{
    setlocale(LC_ALL,"");
    long double e,t;
    cout<<"Введiть похибку\n";
    cin>>e;
    cout<<"Введiть t\n";
    cin>>t;
    long double A=1,B=1,C=1;
    long double tempA,tempB,tempC;
    int i=0;
    long double a1=f1(t);
    long double a2=f2(t);
    long double a3=f3(t);
    cout<<"Промiжнi значення похибки\n";
    do{
        ++i;
        tempA=rowElement(i,a1,1.0/4);
        tempB=rowElement(i,a2,1.0/5);
        tempC=rowElement(i,a2,1.0/9);
        A+=tempA;
        B+=tempB;
        C+=tempC;
        cout<<abs(tempA)+abs(B*tempC)+abs(C*tempB)<<endl<<endl;
    }
    while(e<abs(tempA)+abs(B*tempC)+abs(C*tempB));
    cout<<endl;
    cout<<"Вiдповідь"<<A+B*C;
    cout<<endl;
    system("PAUSE");
}

// тут функції для обрахунку x в рярі тейлора
// (1+x)^a (в третьому звів до такого вигляду)
long double f1(long double x)
{
    return -1*pow(cos(x),4)/4;
}
long double f2(long double x)
{
    return atan(x)/2;
}
long double f3(long double x)
{
    return -1*(x*x+2)/(x*x+3);
}
// функція для обрахунку і-го(i>1) члена ряда тейлора
// x,a-це звідси (1+x)^a 
long double rowElement(unsigned i,long double x,long double a)
{
    long double temp=1;
    for (unsigned j=0;j<i;++j){
        temp*=a-j;
    }
    return (temp*x)/Factorial(i);
}

в залежності від e i t деколи виводить правильну відповідь деколи ні,воно на якомусь моменті перестає зменшувати похибку і починає різко зростати,я не розумію чому
http://cs7001.vk.me/c613525/v613525715/120b/jx-r_sWmA6I.jpg

20

Re: Поможіть обчислити значення виразу

tempC=rowElement(i,a2,1.0/9);

Точно?

Подякували: Mafia1