Skocz do zawartości
DrKleiner

Mały Problem Z Funkcją

Rekomendowane odpowiedzi

Jako że w programowaniu jakoś super sprytny nie jestem i mam problem. Kazano mi napisać program w Pascalu który policzy mi miejsce przecięcia się dwóch funkcji. Coś próbowałem ale nie wiem jak zapisać drugą funkcje. Może jakiś układ? Pomoc. Nie jest to odrabianie zadań :unsure: tylko pomoc, bo niestety nie wychodzi mi to.

Z góry dzięki za pomoc

 

 

 

Var x:real; a,b,c:real; eps:real;Function f(x:real):real;Begin f:=x*x*x-8;End;Begin writeln('program znajduje miejsce zerowe funkcji'); writeln('w przedziale [a;b]'); write('podaj wartosc a:= '); readln(a); write('podaj wartosc b:= '); readln(b); write('podaj dokladnosc'); readln(eps); repeat;   c:=(a+b)/2;   if (f(a)+f(c)) < 0 then	b:=c   else	a:=c; until (abs(b-a) < eps) Or (f(a)=0) Or (f(b)=0) Or (f(c)=0); if f(a)=0 then writeln('wynik a:= ',a)  else   if f(b)=0 then writeln('wynik b:= ',b)	else	 if f(c)=0 then writeln('wynik c:= ',c)	  else	   writeln('wynik c:= ','+ -',eps); readln;End.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak na szybkiego:

 

#pragma hdrstop#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#pragma argsusedfloat f1(float x) {return x * x + 3;}float f2(float x) {return -x * x + 3 * x + 6;}int main() {  float a = 0, b = 4, c, eps = 0.001;  int step = 0, max_step = 1000;    do {  c = (a + b) / 2;  if ((f1(c) - f2(c)) * (f1(b) - f2(b)) < 0) a = c; else b = c;  step++;  } while (fabs(f1(c) - f2(c)) > eps && step < max_step);    printf("x: %f", c);	  return 0;}

Pascala nie trawię. Kod z łatwością przerobisz. Nie daję gwarancji, że w każdym przypadku będzie działać jak należy bo programista raczej kiepski ze mnie :/

 

P.S. 1 Max_step to "zawór bezpieczeństwa" w pętli. Dodałem na wszelki wypadek gdyby funkcje w przedziale [a, b] się nie przecięły. Jeśli funkcję się przecinają, a zadana dokładność nie została osiągnięta, to trzeba zwiększyć wart. max_step.

 

 

P.S. 2 Przed wejściem do pętli można sprawdzić czy istnieje co najmniej jeden punkt przecięcia funkcji. Musi być spełniony ten warunek:

 

(f1(a) - f2(a)) * (f1(b) - f2(b)) < 0

 

 

 

EDIT:

 

Przy parzystej liczbie przecięć funkcji w przedziale w/w warunek nie będzie spełniony. W takim wypadku należy zawęzić przedział do jednego przecięcia. W przypadku nieparzystej liczby przecięć też należy zawęzić przedział.

Edytowane przez Dj_AnT

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...