Kod z Matlaba do języka C

0

Zaczynam naukę programowania w języku C, mam podany kod wykonany w matlabie i muszę go zapisać w języku C:

n = 1089498
s = (exp(gammaln((n+1)/2) - gammaln(n/2)))*(1/sqrt(pi*n))
x = @(t)s*(1+((t.^2)/n)).^(-(n+1)/2);
q1 = integral(x, 0, 5633.107);

Proszę o pomoc.

0

A mógłbyś opisać trochę bliżej te funkcje Matlaba?

0

@lion137: Chodzi tutaj o to aby scałkować postać funkcji PDF (Probability density function), która ma postać podaną w załączniku. Należy ją scałkować w moim przypadku w przedziale <0, 5633.107>.
Z racji tego tego, że postać funkcji gamma dla zadanych parametrów przyjmuję wartości nieskończone zostało zastosowane przekształcenie logarytmiczne (zmienna s).

0

Jakie przekształcenie logarytmiczne? Gdzie jest zmienna s?

1

Z czym masz problem:

  • Nie rozumiesz co napisane w Matlabie?
  • Nie znasz na tyle C?
0

@lion137: Część podanej funkcji PDF (którą podałem w poprzednim komentarzu) zawierającej funkcje gamma, została zapisana pod zmienna s (w treści wątku) i dołączona do pozostałej części funkcji PDF ( zmienna x w treści wątku), dlatego zamiast:
s = (gamma((n+1)/2) - gamma(n/2))*(1/sqrt(pi*n))
jest
s = (exp(gammaln((n+1)/2) - gammaln(n/2)))*(1/sqrt(pi*n))

0

@_13th_Dragon: Póki co nie znam na tyle C, aby móc to zapisać, mam napisany program w C wykorzystujący obliczanie całki dla zadanej funkcji jednak próby zapisania tej funkcji kończą się niepowodzeniem.

1

Pokaż te próby

0
#include <stdio.h>
#include <math.h>

int main(){

  double a, b, dx, ai, bi, suma_pole, s;
  int n, i, c;

  c = 1089498;
  s = (exp(log(gamma((c+1)/2))) - (log(gamma(c/2))))*(1/(sqrt(M_PI*c)));

  double fun (double t) {
  return (pow((s*(1+((t*t)/c))),(-(c+1)/2)));
  }

  /* Wczytanie granic przedziału oraz precyzji całkowania z konsoli. */

  printf("Proszę podać dolną granicę przediału całkowania [a]:\n");
  scanf("%lf", &a);
  printf("Proszę podać górną granicę przediału całkowania [b]:\n");
  scanf("%lf", &b);
  printf("Proszę podać precyzję całkowania [n]:\n");
  scanf("%d", &n);

  /* Obliczenie podprzedziału */

  dx=(b-a)/n;

  /* Pętla sumująca pola kolejnych trapezów wykorzystywanych do obliczenia całki */

  for(i=0; i<n-1; i++) {
    ai=a+i*dx;
    bi=ai+dx;
    suma_pole+=dx*((fun(ai)+fun(bi))/2);
    }

  /* Wydruk wyniku na ekran */

  printf("Wartość całki funkcji f(t) dla przedziału (a, b) wynosi %.6lf.\n", suma_pole);

return 0;
}
0

Wynieś funkcję fun() na zewnątrz sprawdź jeszcze raz i napisz jaki masz problem jeżeli wciąż będzie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0