Kod: |
double horner(double a[], int n, double x)
{ double p=0, q=0, fakt=1, y; int i; for(i=1; i<=2*n+3; i++) fakt*=i; /*izracunamo linearno vrijednost pocetnog faktorijela, a onda cemo ga smanjivati u hornerovoj petlji.*/ y=3*x; /*polinome rastavimo na dva dijela i ocito (3^k)(x^k)=(3x)^k pa vrijednost drugog polinoma racunamo u tocki y=3*x*/ for(i=n; i>=0; i--){ fakt/=(2*i+3)*(2*i+2); p=p*x+a[2*i]*fakt; q=q*y-a[2*(n-i)+1]; } return p+q; } |
Kod: |
double horner(int n, double t[], double x)
{ int i; unsigned f=1; double p=0, b; b=x-2; for(i=n; i>=0; i--){ p=p*b+t[i]*f; f*=n-i+1; /*s ovim racunamo faktorijele linearnom slozenoscu*/ } return p; } |
mdoko (napisa): |
U zadatku treba izračunati vrijednost izraza [tex]P_n(x) = \sum\limits_{k=0}^{n}\left(a_{2k}(2k+1)! - a_{2(n-k)+1}3^k\right)x^k[/tex]. Očito je [tex]P_n(x) = \sum\limits_{k=0}^{n}a_{2k}(2k+1)!x^k - \sum\limits_{k=0}^{n}a_{2(n-k)+1}(3x)^k[/tex], što znači da [tex]P_n(x)[/tex] možemo računati kao [tex]P_n(x) = A_n(x) - B_n(3x)[/tex], pri čemu je [tex]A_n(x) = \sum\limits_{k=0}^{n}a_{2k}(2k+1)!x^k[/tex], a [tex]B_n(x) = a_{2(n-k)+1}3^kx^k[/tex]. Izrazi [tex]A_n(x)[/tex] i [tex]B_n(3x)[/tex] se lako izračunavaju pomoću Hornerovog algoritma. Ovo bi trebalo razjasniti što se je mislilo pod "polinome rastavimo na dva dijela" i zašto jednog izračunavamo u x, a drugog u 3x. Ako ti još uvijek nije jasno kako riješiti zadatak (u varijanti za 15 bodova), onda pitaj za dodatna pojašnjenja. . |
PilotGrip (napisa): |
Npr. Mi rastavljamo polinom na vise dijelova. Npr. F(n)=n, h(x)=x, r(x)=?, a(g[i])=? |
krilo (napisa): | ||
E hvala PilotGripu što je načeo temu, mene zanima isti zadatak. Oni su u rješenjima program napisali ovako (direktno copy-pasteano):
Meni samo nije jasno kako su oni došli do p=p*b+t[i]*f i f*=n-i+1. Probala sam raspisati, ali ništa smisleno od toga svega. |
Citat: |
Ako ti se da razjašnjavati, bilo bi super; ako ne, ne sekiraj se, vjerojatno neće toga sutra biti u kolokviju. |
Kod: |
int p=0;
for (i=f(n); i>=0; i--) { p = p*h(x) + a[g(i)]; p* = r(x); } |
Kod: |
/* Prvo dvije pomocne funkcije.
* Racunamo u double-ovima, jer je to tip u kojem se trazi rezultat u zadatku. */ /* Funkcija koja racuna 3^n. Funkcija pretpostavlja da je n >= 0. */ double potencija_od_3(int n) { double rezutat = 1; for( ; n > 0; --n) rezultat = rezultat * 3; return rezultat; } /* Funkcija koja racuna n!. Funkcija pretpostavlja da je n >= 0. */ double faktorijel(int n) { double rezultat = 1; int i; for (i = 1; i <= n; ++i) rezultat = rezultat * i; return rezlutat; } /* Hornerovim algoritmom razunamo vrijednost polinoma A_n u tocki x. Funkcija pretpostavlja da niz a sadrzi unaprijed zadane vrijednosti za a_0, a_1, ..., a_{2n+1} */ double A(double a[], int n, double x) { int k; double rezultat = a[2 * n] * faktorijel(2 * n + 1); /* Krenemo s vodecim koeficijentom. */ for(k = n -1; k >= 0; --k) { double koeficijent = a[2 * k] * faktorijel(2 * k + 1); /* Koeficijent koji je sada na redu. */ rezultat = rezultat * x + koeficijent; /* Vrijednost iz prethodnog koraka pomnozimo s x i dodamo koeficijent. */ } return rezultat; /* Na kraju vratimo izracunatu vrijednost. */ } /* Hornerovim algoritmom razunamo vrijednost polinoma B_n u tocki x. Funkcija pretpostavlja da niz a sadrzi unaprijed zadane vrijednosti za a_0, a_1, ..., a_{2n+1} */ double B(double a[], int n, double x) { int k; double rezultat = a[1] * potencija_od_3(n); /* Krenemo s vodecim koeficijentom. */ for(k = n -1; k >= 0; --k) { double koeficijent = a[2 * (n - k)] * potencija_od_3(k); /* Koeficijent koji je sada na redu. */ rezultat = rezultat * x + koeficijent; /* Vrijednost iz prethodnog koraka pomnozimo s x i dodamo koeficijent. */ } return rezultat; /* Na kraju vratimo izracunatu vrijednost. */ } /* Konacno mozemo napisati funkciju koja se trazi u zadatku. Funkcija pretpostavlja da niz a sadrzi unaprijed zadane vrijednosti za a_0, a_1, ..., a_{2n+1} */ double P(double a[], int n, double x) { return A(a, n, x) - B(a, n, x); } |
Citat: |
nego ste vas dvoje zbunjeni oko Hornerovog algoritma |
Kod: |
double rezultat = a[2 * n] * faktorijel(2 * n + 1); /* Krenemo s vodecim koeficijentom. */
for(k = n -1; k >= 0; --k) { double koeficijent = a[2 * k] * faktorijel(2 * k + 1); /* Koeficijent koji je sada na redu. */ rezultat = rezultat * x + koeficijent; |
krilo (napisa): |
Stihoklepstvo - prva liga. |
Citat: |
Jel možemo mi i vodeći član staviti u petlju (počnemo od k=n, čisto opažanje)? |
Citat: |
Ja sam mislila da tu treba biti samo jedna bućkuriš-funkcija koja bi iščarobirala oba polinoma... |
Citat: |
Meni je općenito malo glupo računati faktorijele na "običan" način jer nam stalno govore da će uskoro taj broj postati prevelik |
Citat: |
after all, kaj imam od programa koji ne radi; ako neće raditi za sve, kak to može biti dobar program/dobro riješen zadatak? |
Citat: |
S kojom vrijednosti onda treba započeti račun? |
Kod: |
double rezultat=0;
for(k = n; k >= 0; --k) { rezultat = rezultat * x + a[2 * k] * faktorijel(2 * k + 1); ... |
Citat: |
ako nešto ne stane u npr. double, onda ne stane. Kako ga računaš ti neće pomoći. |
krilo (napisa): | ||||
Pretpostavljam s nulom.
|
output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.