Тема: Ряд Тейлера

Є спосіб ефективніше використати покажчик на функцію в даній програмі ?
Перевірте функцію Thaler_cos , Thaler_e я невпевнений що вони правильні. 

Завдання (Книга Т.В.Ковальчук ст-189)
Надрукувати таблиці значень функцій сох(х) та е^x на відрізку [а; b] із кроком h, розвинувши функції у ряд Тейлора та використавши покажчики на функції. Для довідки: ряд Тейлора для функції cos(x) =1 - х^2/2! + х^4/4! - х^6 /6! +..., ряд Тейлора для функції е^x=1 + х / 1! + x^2/2! + х^3 / 3 + ...
Тейлор - http://ru.wikipedia.org/wiki/%D0%FF%E4_ … B%EE%F0%E0

#include <conio.h>
#include <iostream>
using namespace std;

float Thaler_cos(float x)
{
    static int h = 1;
    h++;
    return 1+x/h;
}

float Thaler_e(float x)
{
    static int h = 0;
    h += 2;
    return 1-pow(x,2)/x;
}

float(*function_pointer[])(float) = {
    Thaler_cos,
    Thaler_e 
};

int main()
{
    float a, b, h;
    cout << "Enter the segment A to B ->";
    cin >> a >> b;
    cout << "Enter the step H ->";
    cin >> h;
    for (; a <= b; a += h)
    {
        cout << "cos(" << a << ") = " << function_pointer[0](a) << endl;
        cout << "e^" << a << " = " << function_pointer[1](a) << endl;
    }
    getch();
    return 0;
}

2

Re: Ряд Тейлера

Пане, а ви взагалі це запускали? Результати вас задовольнили?
Ні, функції не те щоб неправильні, а просто повна маячня написана.

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

3

Re: Ряд Тейлера

Справа в тому що я не зрозумів ряд Тейлора тому результати не перевіряв, якщо Ви зможете напишіть одну із функцій. Але справа не в цьому, мені цікаво було б дізнатися чи правильно я використав покажчик на функцію, бо якоїсь користі я від нього не бачу лише зайвий алгоритм, можна було б зразу викликати Thaler_cos , Thaler_e.

4

Re: Ряд Тейлера

Прикладів реалізації ряду Тейлора в мережі - загуглитися.
Перевірити результати дуже просто: обчислити стандартною функцію і рядом Тейлора і порівняти.
Вказівники ви використали правильно; безглуздо, так, але ж в умові сказано - використати, ви і використали. Хоча якби написали якийсь код, де не було б жорстко прописано, яку саме функцію викликати (хоча б цикл зробили від 0 до 1 замість двох викликів), то було б краще.

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

5

Re: Ряд Тейлера

Допоможіть з функціями Thaler_cos та Thaler_e щось ніяк не виходить

#include <conio.h>
#include <iostream>
using namespace std;

float Thaler_cos(float x,float h)
{
    static float suma=1;
    static float product=1;
    suma += (product *= x / h);
    return suma;
}

float Thaler_e(float x, float h)
{
    static float suma=1;
    static float product=1;
    suma += (product *= x / h);
    return exp(suma);
}

float(*function_pointer[])(float, float) = {
    Thaler_cos,
    Thaler_e 
};

int main()
{
    float a, b, h;
    cout << "Enter the segment A to B ->";
    cin >> a >> b;
    cout << "Enter the step H ->";
    cin >> h;
    for (; a <= b; a += h)
    {
        function_pointer[1](a, h);
    }
    cout << "cos(x) = " << function_pointer[0](a, h) << endl;
    cout << "e^x = " << function_pointer[1](a, h) << endl;
    getch();
    return 0;
}

6

Re: Ряд Тейлера

Що таке "segment A to B"? В ряді Тейлора немає нічого подібного.

7

Re: Ряд Тейлера

на відрізку [а; b] із кроком h, Читайте завдання з верху

8

Re: Ряд Тейлера

Ага, був неуважний. Я не можу зрозуміти, чому в функції Thaler_e (судячи з назви, обчислення суми ряду Тейлора для експоненти) викликається exp?

9

Re: Ряд Тейлера

Taylor не так пишеться. І не так обчислюється. Ви взагалі розумієте, що таке static і нащо він потрібен?

10

Re: Ряд Тейлера

static я написав тому що хочу зберегти значення переміних. Я взагалі не розумію ряд Тейлора тому і прошу допомоги. quez той алгоритм що в функції Thaler_e не мій я такий алгоритм знайшов в інтернеті і трошки його переробив ну як бачите він неправильно працює.

11

Re: Ряд Тейлера

Вам не треба нічого зберігати тут. Проста задача: як обчислити суму чисел від 1 до 10 - знаєте, як таке робити? От приблизно так і тут треба, тільки члени ряду обчислюються складніше, а додавати їх треба, доки вони не стануть достатньо малими.

12

Re: Ряд Тейлера

Ну от формула для експоненти:
http://upload.wikimedia.org/math/b/7/8/b787ab22b595efd5dcda6762a222fdac.png
Рахуєте суму кількох перших членів (підставляєте n=0, n=1, і т. д.) і все, по суті.

static не зберігає змінні, воно лише робить змінну членом не об'єкта, а класу.

13

Re: Ряд Тейлера

quez, формула є в першому повідомлені, а static таки зберігає...

14 Востаннє редагувалося quez (08.07.2014 15:14:53)

Re: Ряд Тейлера

Оце так. Вбив собі в голову, що тут static той же, що й у джаві.

15

Re: Ряд Тейлера

І взагалі я сьогодні страждаюнасолоджуюсь неуважністю.

16

Re: Ряд Тейлера

Сума 1 до 10

#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    int sum = 1;
    for (int i = 1; i <= 10; i++)
    {
        cout << sum << " + " << i << " = " << sum + i << endl;
        sum += i;
    }
    getch();
    return 0;
}

Тейлор - http://ru.wikipedia.org/wiki/%D0%FF%E4_ … B%EE%F0%E0
якщо подивитися на cos(x) = сума до безкінечності від n=0 ((-1)^n)/(2n+1!)*x^2*n,
n це a, замість безкінечності b, а що тоді х. Якщо можете напишіть функцію Thaler_cos , Thaler_e бо я так і нічого не зрозумів

17

Re: Ряд Тейлера

quez у формулі експоненти я не розумію що таке х і що таке n!

18 Востаннє редагувалося koala (08.07.2014 16:33:32)

Re: Ряд Тейлера

Сума обчислюється неправильно (з 0 починати треба), але тим не менш допоможу

double taylor_cos( double x ) //обчислює cos з точністю 0.0001
{
  double sum = 0., element = 1.;
  for ( int i = 1; element > 0.0001; i += 2 )
  {
    sum += element;
    element *= - x * x / ( i * ( i + 1 ) ); //обчислюємо черговий елемент
  }
  return sum + element;
}
Подякували: Betterthanyou2

19

Re: Ряд Тейлера

Betterthanyou написав:

quez у формулі експоненти я не розумію що таке х і що таке n!

х - це точка, значення експоненти в якій ми прагнемо відшукати (у вашому завданні саме x потрібно змінювати від A до B). Для цього ми шукаємо суму ряду Тейлора, де 1 - це нульовий член, x - перший, x^2/2 - другий, а x^n/n! - n-ний.

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

20

Re: Ряд Тейлера

X - це аргумент функції. Ви взагалі знаєте, що таке аргумент?
n! - факторіал числа n, обчислюється за формулою n! = n * (n - 1) * (n - 2) * ... * 2 * 1, і додатково визначено 0! = 0.

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