Program w C - nie rozumiem treści.

0

Witam.
Mam mały problem z zadaniem.
Otóż nie rozumiem jego treści więc nawet nie wiem jak zacząć.
Czy mógłby mi ktoś pomóc rozjaśnić treść tego zadania?

Tablicowanie funkcji w zadanym przedziale, z zadaną liczbą
podprzedziałów, z wykorzystaniem rozwinięcia w szereg.
Dane wejściowe do programu: przedział, w którym funkcja ma
być tablicowana, liczba podprzedziałów
Podobnie jak w programie, który robiliśmy na zajęciach, a
dostępnym jako dokument programy3 na tej stronie trzeba
napisać funkcję szereg, która na podstawie rozwinięcia w
szereg oblicza wartość funkcji dla danego argumentu.
Na ekranie mają się pojawić 3 kolumny liczb: argument (x),
wartość funkcji z biblioteki matemtycznej dla x, wartość
funkcji szereg dla x.
W funkcji szereg nie uŜywamy funkcji pow ani silnia; do
obliczenia kolejnego wyrazu szeregu wykorzystujemy wyraz
poprzedni.
A pow((1+x),m)
B sqrt(1+x)
C 1/(1+x)
D 1/sqrt(1+x)
E pow(a,x)
F ln(1+x)
G ln(1-x)
H arcsin(x)
I acos(x)
J sinh(x)
K cosh(x)
L asinh(x)
M 1/(1+xx)
N atan(x)
O ln(x)
P ln((1+x)/(1-x))
R pow((1+x),1,/3)
S 1/sqrt(1-x
x)
T pow((1+x),m)
U sqrt(1+x)
Rozwinięcia funkcji naleŜy znaleźć w ksiąŜkach matematycznych
lub w internecie (np. wolfram)

Do mnie należy projekt S.
Pozdrawiam

4

I której części nie rozumiesz?

  1. Rozwijasz sobie na kartce swoją funkcję matematyczną w szereg Taylora.
  2. Piszesz funkcje (w języku programowania) która oblicza wartość twojego wyznaczonego szeregu w zadanym punkcie poprzez użycie pętli for. Jeśli na przykład szereg będzie miał postać S = x + x^2 + x^3 + ... + x^i to masz zauważyć że kolejny wyraz szeregu to jest wyraz poprzedni pomnożony przez x. Więc nie robisz żadnego pow(x,i) tylko
x = cośtam;
wyraz = x;
for(int i=1;i<n;i++){
  suma = suma + wyraz;
  wyraz = wyraz*x;
}
  1. Wczytujesz od użytkownika początek przedziału, koniec przedziału i liczbę podprzedziałów.
  2. Robisz pętlę od początku przedziału do końca przedziału z krokiem wyznaczonym przez liczbę podprzedziałów (jeśli przedział to [0,1] a liczba podprzedziałów to 10 to pętla wykonuje się dla x=0,0.1,0.2,0.3,...,0.9,1)
  3. Wypisujesz na ekranie: X (z pętli powyżej), wartość twojej funkcji liczącej szereg w punkcie X, wartość twojej funkcji w punkcie X korzystając ze standardowych obliczeń języka programowania.

Czyli generalnie to będzie:

double poczatek, koniec;
int przedzialy;
scanf("%f %lf %d". &poczatek, &koniec, &przedzialy);
double delta = (koniec-poczatek)/przedzialy;
double x = poczatek;
while(x<koniec){
    printf("%f %f %f", x, funkcjaTaylor(x), 1.0/(sqrt(1-x*x)));
    x = x+delta;
}
0

Jestem po technikum informatycznym, świeżo na studiach i przyznam szczerze dużo mi nie rozjaśniłeś.
Pojęcie Tablicowania słyszę po raz pierwszy zarówno jak szereg Taylora.

0

Witam, jako, że forumowicz który założył ten temat jest pewnie z mojego roku i mam problem z tym samym zadaniem to nie tworzę nowego tematu. Zaszedłem troszkę dalej, ale mam pewien problem ponieważ program wykonuje się i liczy funkcję dla x z przedziału (-1;2.2), dla x=-1 wyświetli wynik 1.NaN. Ktoś podpowie jak ograniczyć wyświetlanie liczby do konkretnego miejsca po przecinku? Bo to chyba będzie rozwiązanie prawda? Poniżej zamieszczam kod programu:
moją funkcją która ma zostać rozwinięta w szereg było f(x)=1/(1+x)

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

double potega(double a, int b)
{	
	int i;
	double w=1;
	for(i=1;i<b;i++)
	{
		w=w*a;
	}
	return w;
}
double szereg(double x,int n)
{	
	int i,m;
	double wyn,s;
	wyn=x;
	s=x;
	m=n;

	if(fabs(x)<1)
	{
		for(i=1;i<n;i++)
		{
			wyn=wyn*potega(-1,i)*potega(x,i);
			s=s+wyn;
			m--;
		}
	return s;
	}
	if(fabs(1-x)<2)
	{
	
		for(i=1;i<n;i++)
		{
			wyn=wyn*potega((-1+x),i)*potega(-1,i)*potega(2,(-1-i));
			s=s+wyn;
			m--;
		}
	return s;
	}
		
}
int main()
{
	double a,b,licz,x; /* <a;b> przedział, licz licznik przebiegu, x - liczba, */
	int n;	/* n-ilosc podprzedziałów */
	printf("Prodaj krance przedzialow:\n");
	scanf("%lf %lf",&a,&b);
	printf("\n Podaj ilosc podprzedzialow:");
	scanf("%d",&n);
	printf("\n");
	licz=(b-a)/n;
	x=a;
	while(x<b)
	{
		printf("x=%lf	wartosc z biblioteki=%lf	wartosc z szeregu=%lf	\n",x,1.0/1.0-x,szereg(x,n));
		x=x+licz;
	}
	return 0;
}
1

Ktoś podpowie jak ograniczyć wyświetlanie liczby do konkretnego miejsca po przecinku?

http://en.cppreference.com/w/cpp/io/c/fprintf
Generalnie:

printf("Rounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);

Daje: Rounding: 1.500000 2 1.30000000000000004440892098500626

1/(x+1) dla x = -1 daje 1/0, dlatego masz NaN (Not a Number).

Następnym razem twórz własny temat, jeden problem, jeden wątek. Wtedy możesz oznaczyć post który rozwiązał Twój problem, a jak kiedyś ktoś będzie chciał znaleźć Twój problem(lub nawet Ty w przyszłości) to będzie po prostu prościej.

0

@Bremervor słabo mi jak czytam takich studentów. NaN wcale nie oznacza że masz problem z dokładnością obliczeń, tylko że nie rozumiesz matematyki ani metod numerycznych. Dzielisz przez 0 i spodziewasz się że jaki uzyskasz wynik? Pomyślałeś w ogólę co za obliczenia wykonujesz?

0

pow((1+x),m) - Witam. Czy ktoś mógłby mi wskazać gdzie robię błąd? W tabeli zamiast wyświetlanych wartości pojawia się wartość "inf".

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

#define LWR 1000

double potega(double x){
    double s = 0;
    double w=0;

    if (x<1&&x>-1)
    {


    int k,m;
        w=s=x;
        for(k=1;k<LWR;k++){
            w = w * x*((m-1))/2;
            s+=w;
    }
    }
    return s;
}
double ab(double b){
    if (b<0) return -b;
    return b;
}
int main(){
    double x;
    int m;
    printf("|   Argument x\t|\tpotega(x)\t|\tWbudowana\t|\tBlad pomiaru\t|\n");
    for(x=1;x<=5;x+=0.1){
      printf("|     %1.1lf\t|\t%lf\t|\t%lf\t|\t%lf\t|\n",x,pow(x,m),potega(x),ab(pow(x,m)-potega(x)));
    }
    return 0;
}
 
3

Zacznijmy od początku: gdzie ustalasz wartość m? W obu funkcjach.

2
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Zapoznaj się z inkrementacją bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  3. ab() już istnieje - nazywa się fabs()
  4. Gdzie mas inicjalizacje m ?

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