уравнение численного анализа

63
4

У меня есть это уравнение here, а затем найдите многочлен из here

Я пытаюсь реализовать его следующим образом:

for (int n=0;n<order;n++){
df[n][0]=y[n];
for (int i=0;i<N;i++){ //N number of points

df[n][i]+=factorial(n,i)*y[i+n-1];
}

}

for (int i=0;i<N;i++){

term=factorial(s,i);
result*=df[0][i]*term;
sum+=result;
}

return sum;

1) Я не уверен, как реализовать знак каждого аргумента в функции. Как вы видите, это выглядит как "положительный", "отрицательный", "позитивный"...

2) Я не уверен в каких-либо ошибках...

Благодарю!

----------------------факториал--------------------------- -

int fact(int n){
//3!=1*2*3
if (n==0) return 1;
else
return n*fact(n-1);

}

double factorial(double s,int n){
//(s 3)=s*(s-1)*(s-2)/6
if ((n==0) &&(s==0)) return 1;
else
return fact(s)/fact(n);

}

спросил(а) 2021-01-25T20:31:58+03:00 4 месяца, 4 недели назад
1
Решение
88

Самое простое решение, вероятно, просто сохранить знак в переменной и умножить его каждый раз на цикл. Что-то вроде:

sign = 1.0;
for ( int i = 0; i < N; ++ i ) {
term = factorial( s, i );
result *= df[0][i] * term;
sum += sign * result;
sign = - sign;
}

ответил(а) 2021-01-25T20:31:58+03:00 4 месяца, 4 недели назад
78

Вы не можете выполнить pow( -1, m ).

Вы можете написать свой собственный:

inline int minusOnePower( unsigned int m )
{
return (m & 1) ? -1 : 1;
}

Вы можете создать несколько таблиц вычисленных значений.

ответил(а) 2021-01-25T20:31:58+03:00 4 месяца, 4 недели назад
62

Хорошо, я понимаю, что вы хотите приблизительно рассчитать значение f (x) для заданного x = X, используя полином Ньютона с интерполяцией с эквидистантными точками (точнее, полином Ньютона-Грегори-интерполяционного интерполяционного полинома). Предположим, что s = (X-x0)/h, где x0 - первое x, а h - шаг для получения остальной части x, для которой вы знаете точное значение f: Considere:

double coef (double s, int k)
{
double c(1);
for (int i=1; i<=k ; ++i)
c *= (s-i+1)/i ;
return c;
}

double P_interp_value(double s, int Num_of_intervals , double f[] /* values of f in these points */) // P_n_s
{

int N=Num_of_intervals ;

double *df0= new double[N+1]; // calculing df only for point 0

for (int n=0 ; n<=N ; ++n) // n here is the order
{
df0[n]=0;
for (int k=0, sig=-1; k<=n; ++k, sig=-sig) // k here is the "x point"
{
df0[n] += sig * coef(n,k) * f[n-k];
}
}

double P_n_s = 0;

for (int k=0; k<=N ; ++k ) // here k is the order
{
P_n_s += coef(s,k)* df0[k];
}
delete []df0;

return P_n_s;
}

int main()
{
double s=0.415, f[]={0.0 , 1.0986 , 1.6094 , 1.9459 , 2.1972 };

int n=1; // Num of interval to use during aproximacion. Max = 4 in these example
while (true)
{
std::cin >> n;
std::cout << std::endl << "P(n=" << n <<", s=" << s << ")= " << P_interp_value(s, n, f) << std::endl ;
}
}

он печатает:

1

P (n = 1, s = 0,415) = 0,455919

2

P (n = 2, s = 0,415) = 0,527271

3

P (n = 3, s = 0,415) = 0,55379

4

P (n = 4, s = 0,415) = 0,567235

сравните с: http://ecourses.vtu.ac.in/nptel/courses/Webcourse-contents/IIT-KANPUR/Numerical%20Analysis/numerical-analysis/Rathish-kumar/rathish-oct31/fratnode8.html

Оно работает. Теперь мы можем начать оптимизировать этот код.

ответил(а) 2021-01-25T20:31:58+03:00 4 месяца, 4 недели назад
45

только для знака ;-)

inline signed int minusOnePower( unsigned int m )
{
return 1-( (m & 1)<<1 );
}

ответил(а) 2021-01-25T20:31:58+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема