Avatar billede langbein Nybegynder
15. november 2001 - 12:52 Der er 3 kommentarer og
2 løsninger

Matematiske funksjoner, derivasjon, integrasjon.

Skal lage et enkelt program for simulering av såkalte \"dynamiske systemer\" eller reguleringstekniske systemer. Har nettop fått en grei løsning på det med grafisk utskrift her gjennom eksperten. Bruker en gammel DOS basert C++ kompilator. Behøver også funksjoner for integrasjon og derivasjon og også dobbeltderivasjon. Finnes det noen ferdige funksjoner man kan bruke eller må man lage tilnærmingsfuksjoner selv ved hjelp av stolpediagram funksjoner og liknende ???
Avatar billede ttn.bonk Nybegynder
15. november 2001 - 18:31 #1
Til numerisk integration vil jeg klart anbefale Simpsons formel, som er simpel, konvergerer hurtigt og er stabil.

f er en funktion defineret i intervallet [a,b].
N er antallet af iterationer vi anvender, f.eks. 100, 1000 eller mere. N skal være et lige heltal: 2,4,8,10,...

Integralet af funktionen f i intervallet [a,b]
er så tilnærmet ved:

I(f) = (b-a)/(3*N)*(f0 + 4*f1 + 2*f2 + 4*f3 + 2*f4 + ... + 2*f(N-2) + 4*f(N-1) + f(N))

hvor
h=(b-a)/N er interval-bredden
f0 = f(a)
f1 = f(a+h)
f2 = f(a+2*h)
f(i) = f(a+i*h), i=0,1,2,3,..,N

f(N) = f(a+N*h) = f(b).

Simpsons formel laver tilnærmelse, ikke ved hjælp af stolpediagram, men parabler (2. grads polynomium).

Derivationer er vel bare

f\'(x) = (f(x+h) - f(x-h))/(2*h) hvor h er et lille tal.

Dette kan så anvendes igen til dobbelt-derivationer.
Avatar billede ttn.bonk Nybegynder
18. november 2001 - 13:44 #2
Eksempel på konsol program, der beregner integralet af en funktion på et givet interval:

//Beregner (numerisk integration) integralet af funktionen f(x) i intervallet [a,b]
// ved hjælp af Simpson\'s formel. Ønskes større nøjagtighed - øg da størrelsen af N til f.eks. 10000
#include \"stdafx.h\"
#include \"math.h\"

double f(double x)
{
  return sin(x);
}

int main(int argc, char* argv[])
{
  int i, N = 1000;
  double a = 0, b = 3.14159265;

  double h = (b-a)/N;
  double f2 = 0, f4 = 0;
  double x;

  // Adder alle elementer der ganges med 4
  x = a+h;
  for (i=1; i<=N-1; i=i+2)
  {
    f4 += f(x);
    x  += h;
  }

  // Adder alle elementer der ganges med 2
  x = a+2*h;
  for (i=2; i<=N-2; i=i+2)
  {
    f2 += f(x);
    x  += h;
  }

  double I = (b-a)/(3*N)*(f(a) + 4*f4 + 2*f2 + f(b));
  printf(\"Integralet af f i intervallet [%f,%f] = %f\\n\",a,b,I);
  // Eksempler:
  // f(x) = sin(x), interval = [0,pi],  integralet er da eksakt 2.
  // f(x) = x*x;    interval = [-1,+1], integralet er da eksakt 2/3 = 0.666666...
    return 0;
}


Til differentiering (derivation):
=================================
f\'(x) = (f(x+h)-f(x-h))/(2*h) for h \"lille\"

f\'\'(x) = (f(x+2*h)+f(x-2*h)-2*f(x))/(4*h*h)
for h \"lille\"


Avatar billede range Nybegynder
18. november 2001 - 21:04 #3
En god on-line bog i numerisk analyse er Numerical Recipes. Den ligger her: http://www.ulib.org/webRoot/Books/Numerical_Recipes/bookcpdf.html Den tager udgangspunkt i C og der er i hvert fald et kapitel om numerisk integration.

/range
Avatar billede langbein Nybegynder
27. november 2001 - 23:07 #4
Tusen takk !
Avatar billede range Nybegynder
30. november 2001 - 09:50 #5
Det var så lidt :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester