С - функция, которая вычисляет интеграл от полинома


Я написал простую функцию, которая принимает массив коэффициентов полинома, а затем интегрирует его. Мой полином представляется такой: $$полинома[0] + полинома[1]х + полинома[2]х^2 + \Dots с + полинома[п]х^п$$ А его неотъемлемыми станут: $$полинома[0]х + \ГРП 1 2 полинома[1]х^2 + \ГРП 1 3 полинома[2] х^3 + \точек + \ГРП{1}{п+1}х^{п+1}$$

#include <stdio.h>

void integrate(double *polynomial, double *buff, int number_of_terms) {
    for(int i = 0; i < number_of_terms; i++) {
        buff[i+1] = polynomial[i] / (i+1);
    }
    buff[0] = 0;
}

int main(void) {
    double polynomial[4] = {1, 2, 3, 4}; // 1 + 2x + 3x^2 + 4x^3
    double buff[5];
    integrate(polynomial, buff, 4);
    for(int i = 0; i < 5; i++) {
        printf("%f, ",  buff[i]);
    }
    //Output: 0.000000, 1.000000, 1.000000, 1.000000, 1.000000
    //0 + x + x^2 + x^3 + x^4
}

Проблема с моим решением, что мне нужно, чтобы установить значение по индексу ноль вручную - я не думаю, что это хорошая практика, и поэтому хотелось бы как-то обернуть индекс 0-я в формуле в цикле. Существует ли простой способ сделать это?



159
0
задан 19 февраля 2018 в 11:02 Источник Поделиться
Комментарии
2 ответа


  • buff не значащее имя. Назвать это integral возможно?

  • Я бы использовал более математической degree а не number_of_terms.

  • В вашем подходе (идет от низшего к высшему степени) polynomial и buff могут никогда не пересекаться. restrict них:

    void integrate(double * restrict polynomial, double * restrict buff, int number_of_terms)

  • Я не вижу другого способа бороться с постоянная интегрирования, но передает его как отдельный параметр.

3
ответ дан 19 февраля 2018 в 03:02 Источник Поделиться

Второстепенные соображения, чтобы добавить к @ВНП хороший ответ.


  1. Изменить double *polynomial --> const double *polynomial чтобы лучше передать функции интерфейс, а также возможность звонить с const массив.

  2. size_t это "Ленок" типа для массива и индексации массива математике не слишком широкая, но и не ограничивая.

  3. Изменение порядка параметров. polynomial идет с number_of_terms еще отделена buff. Многие библиотеки C функции для работы со списками в результате указатель параметры первый "выход" и затем "вход".

    //                v-----------------------------v
    integrate(double *polynomial, double *buff, int number_of_terms)


Собрав все это воедино:

#include <stdlib.h>

void integrate(double * restrict integrated, const double * restrict polynomial,
size_t degree, double c) {
integrated[0] = c;
for(size_t i = 0; i < degree; i++) {
integrated[i+1] = polynomial[i] / (i+1);
}
}

2
ответ дан 19 февраля 2018 в 04:02 Источник Поделиться