Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407

Взятие производной любого порядка

26.02.2019, 18:31. Показов 3239. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Написал функцию, которая берёт производную любого порядка.
Берёт - совпадает с MathCad, но точность 3 знака после точки при 4 порядке производной.
Помогите мне поднять точность хотя бы до 7 знаков после запятой при 4 порядке производной.
Функция нормальная, которая производную ищет?
Спасибо за ответы!

Вызов
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Обёртка для функции
    function<double(double)> f;
//Пакет точек функции
    vector<pair<double, double>> Data_;
 
//Задача функции
    f = [](double x)
    {
        double y = cos(x) * cos(x) - 0.3 * cos(x) - 0.4;
        return y;
    };
 
    function_point_cloud(f, Data_, -1000., 1000., 2500000);
    wcout << get_derivative_n_in_point(Data_, 2., 4u);
    Data_.clear();


Вспомогательная функция
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Облако точек функции
void function_point_cloud
(
    const function<double(double)> &f,
    vector<pair<double, double>> &v,
    const double &min,
    const double &max,
    const double &count_points_split
)
{
    double step = (max - min) / count_points_split;
    double left = min;
    for (size_t u = 0u; u <= count_points_split; ++u, left += step)
    {
        v.push_back(make_pair(left, f(left)));
    }
}


Функция, берущая производную любого порядка (только точность с возрастанием порядка резко падает).
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Взятие любой производной
double get_derivative_n_in_point(const vector<pair<double, double>> &points, const double &x, const size_t &n)
{
    vector<pair<double, double>> box_old(points);
    vector<pair<double, double>> box_new;
    for (size_t p = 0u; p < n; ++p)
    {
        box_new = vector<pair<double, double>>(box_old.size() - 2);
        for (long long u = 1u; u < box_old.size() - 1; ++u)
        {
            double y = (box_old[u + 1].second - box_old[u - 1].second) / (box_old[u + 1].first - box_old[u - 1].first);
            double x = box_old[u].first;
            box_new[u - 1] = make_pair(x, y);
        }
        box_old = box_new;
    }
    size_t ind = 0u;
    for (const auto &value : box_new)
    {
        if (x < value.first)
        {
            break;
        }
        ++ind;
    }
    wcout << ind << endl;
    double res = abs(box_new[ind].first - x) < abs(box_new[ind - 1].first - x) ? box_new[ind].second : box_new[ind - 1].second;
    return res;
}


vector<pair<double, double>> это контейнер с точками pair (у каждой точки есть координаты x и y) соответствующие функции vector<pair<x, y>>.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2019, 18:31
Ответы с готовыми решениями:

Алгоритм Рунге-Кутта для производной второго порядка
Здравствуйте. Нужно составить график зависимости x от t для данного уравнения, для сказали нужно посчитать это уравнение методом...

Вычисления матрицы любого порядка
Есть какой либо алгоритм или формула для вычисления матрицы любого порядка? Или же для каждого порядка писать отдельный код?

Взятие производной второго порядка от сложной функции
Здравствуйте, проблема такая : взял производную второго порядка по правилу, но преподаватель не зачёл , ответив вот что &quot;Когда берешь...

4
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
26.02.2019, 19:26
В функции get_derivative_n_in_point() в строке 11 вы считаете тангенс угла наклона (т.е. значение производной) прямой, проведённой через предшествующую и последующую точки. Не будет ли точнее, если считать тангенс для каждой пары точек предыдущая-текущая, и, соответственно, x для следующей итерации запоминать как среднее между абсциссами предыдущей и текущей точек.
2
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
27.02.2019, 09:24  [ТС]
L0M, спасибо за ответ!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Взятие любой производной слева
double get_derivative_left_n_in_point(const vector<pair<double, double>> &points, const double &x, const size_t &n)
{
    vector<pair<double, double>> box_old(points);
    vector<pair<double, double>> box_new;
    for (size_t p = 0u; p < n; ++p)
    {
        box_new = vector<pair<double, double>>(box_old.size() - 1);
        for (long long u = 1u; u < box_old.size(); ++u)
        {
            double y = (box_old[u].second - box_old[u - 1].second) / (box_old[u].first - box_old[u - 1].first);
            double x = (box_old[u].first + box_old[u - 1].first) / 2.;
            box_new[u - 1] = make_pair(x, y);
        }
        box_old = box_new;
    }
    size_t ind = 0u;
    for (const auto &value : box_new)
    {
        if (x <= value.first)
        {
            break;
        }
        ++ind;
    }
    wcout << ind << endl;
    double res = abs(box_new[ind].first - x) < abs(box_new[ind - 1].first - x) ? box_new[ind].second : box_new[ind - 1].second;
    return res;
}
Почему - то результат сильно зависит (1 знак после точки верен) от разбиения функции на облако точек. Например если задать разбиение от -1000 до 1000 на 2 500 000 частей, то верны 2 знака после запятой?
Если от -100 до 100 на 500 000 частей верен 1 знак после запятой.
Если от -100 до 100 на 1 000 000 частей верно 0 знаков после запятой.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
27.02.2019, 10:24
Лучший ответ Сообщение было отмечено SomniPhobia как решение

Решение

А зачем нужны производные 4 степени?

Если у вас численные производные то они принципиально ограничены по точности.
Как бы вы не старались брать мелким шагом ломанную вы всегда аппроксимируете настоящую функцию, отсюда потеря точности и набегает.
Название: ScreenShot00541.jpg
Просмотров: 78

Размер: 5.8 Кб
Особенно этот эффект будет если функция имеет очень частые колебания с большой амплитудой. Какие бы методы интерполяции не применяли всегда это аппроксимация а не аналитическое решение. Именно по этому мат пакеты пытаются выискивать аналитические производные. Вероятно вы берете линейную интерполяцию на ломанной, попробуйте например параболическую.
Вы берете E а нужно F.
Название: ScreenShot00542.jpg
Просмотров: 78

Размер: 8.1 Кб
Для численной производной нужно взять как можно более мелкий отрезок на функции. Берут не с заданным числом а берут предел точности ЭВМ сигма или как она там называется… Но этот предел зависит от разрядов выбранного числа для хранения значений функций. Есть спец библиотеки для работы с числами большой точности, их используют например для рисования фракталов когда точности дабл не хватает. Точность зависит от количества точек ломанной аппроксимирующих функцию, больше точек – меньше шанс пропустить изменение формы функции…
2
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407
28.02.2019, 12:25  [ТС]
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А зачем нужны производные 4 степени?
Для оценки точности численного взятия интеграла по методу Симпсона.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.02.2019, 12:25
Помогаю со студенческими работами здесь

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

Аппроксимация производной n-го порядка
Добрый день! Есть значения функции y({t}_{i}). Обозначаю {y}_{i}. Нужно через {y}_{i} выразить производную y n-го порядка. Вот так...

Геометрический смыслы производной n-го порядка.
Всем привет. Существует ли какой нибудь геометричсекий смысл у производной n-го порядка?

Записать формулу n порядка производной
y=\sqrt{x}

Нахождение производной 2 порядка функций
Здравствуйте. Не получается решить задание под буквами а и б. Помогите, пожалуйста. Заранее благодарен.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru