Mam do napisania program taki jak w załączniku. Jednak nie mam pojęcia jak ten szereg przedstawić. Mój aktualny kod to:
double suma(double x,int n)
{
int i;
if(fabs(x)<1 && n<100){
for(i=0;i<n;i++){
}
}else return 0;
Mam do napisania program taki jak w załączniku. Jednak nie mam pojęcia jak ten szereg przedstawić. Mój aktualny kod to:
double suma(double x,int n)
{
int i;
if(fabs(x)<1 && n<100){
for(i=0;i<n;i++){
}
}else return 0;
int n
oraz int i
- spodziewasz się ujemnych numerów szeregu?x
- szereg(0)Zapewne masz problem jak wyliczyć n-ty wyraz tego ciągu. Pominiemy 'x' i kwestie znaku w naszych rozwiązaniach. Zauważ, że n-ty wyraz tego ciągu składa się z 2n - 1 elementów. Licznik ma zawsze o 1 element mniej od mianownika. Zauważ też, że licznik to iloczyn kolejnych nieparzystych cyfr, a mianownik to iloczyn cyfr parzystych, z wyjątkiem ostatniej. Więc n-ty element element możesz wyrazić jako (iloczyn liczb nieparzystych / iloczyn liczb parzystych) / liczbę nieparzystą. Ta liczba nieparzysta, to kolejna liczba z szeregu liczb, które znajdują się w liczniku.
A o to część rozwiązania:
double n_element(int number){
int nominator = 1;
int denominator = 1;
int multiplier = 1;
for(multiplier = 1; multiplier < (2 * number - 1); ++multiplier){
if((multiplier % 2) - 1 == 0)
nominator *= multiplier;
else
denominator *= multiplier;
}
if(number % 2 == 0)
return -(double)nominator / (double)(denominator * multiplier);
else
return (double)nominator / (double)(denominator * multiplier);
}
W takim razie czy tak:
double n_element(double x, int number){
double value = 0.0;
if(fabs(x) < 1 && number < 100){
if(number == 0)
value = 1.0;
else{
value = x;
do{
value *= -(pow(2.0 * number - 1.0, 2.0) / (2.0 * number * (2.0 * number + 1.0))) * x * x;
}while(--number > 0);
}
}
return value;
}
będzie poprawnie?
Na to samo ci wychodzi, jeżeli masz funkcje n_element to już jest źle.
Każdy kolejny element wyliczaj na podstawie poprzedniego.
I od razu ich sumuj.
int number
- czyżby spodziewałeś się ujemnych numerów?
if(fabs(x) < 1 && number < 100)
- to sprawdzaj na zewnątrz funkcji.
pow(2.0 * number - 1.0, 2.0)
- nie używaj pow
do potęg całkowitych tym bardziej 2 lub 3, wydaje mi się że masz problem z kolejnością operacji w matematyce.
I po raz kolejny:
double n_sum(double x, unsigned int count){
double sum = 0.0;
if(fabs(x) < 1 && count < 100){
sum = 1.0;
if(count > 0){
double value = x;
unsigned int number = 1;
do{
value *= -((2.0 * number - 1.0) * (2.0 * number - 1.0) / (2.0 * number * (2.0 * number + 1.0))) * x * x;
sum += value;
}while(count > number++);
}
}
return sum;
}
A miało być proste.
Sprawdź co ci zwraca dla count = 0, count = 1 i count = 2 i policz to w excelu lub openoffice
double suma(double x,int n)
{
int i;
if(fabs(x)<1 &&(n>0&& n<100)){
double sum,wyr;
sum=x;
wyr=x;
for(i=1;i<n;++i){
wyr*=-(2*i-1)*(2*i-1)*x*x/((2*i+1)*2*i);
sum+=wyr;
}
return sum;
}else return 0;
}
Czy ten kod jest poprawny, czy użyłem tu jakiś zbędnych rzeczy?
To straszne! http://ideone.com/81hHxF
#include <stdio.h>
#include <math.h>
double suma(double x,unsigned n)
{
if((fabs(x)>=1)||(n<1)) return 0;
double item=x,sum=item;
for(unsigned i=2,p=1;i<=n;++i,p+=2,sum+=item) item*=-x*x*p*p/((p+1)*(p+2));
return sum;
}
int main(void)
{
for(unsigned n=0;n<=4;++n) printf("%u %.12lf\n",n,suma(0.1,n));
return 0;
}