bisekcja w c

0

Witam kolegów!
mam pewien problem z napisaniem programu który miałby znajdować miejsca zerowe funkcji za pomoca bisekcji ( połowienia przedziałow).Mam program który oblicza ów miejsca zerowe lecz jest w nim podana funkcja x^2+x+1, a ja mam wprowadzic do tego programu funkcje o wpisywanych współczynnikach ( axx+b*x+c) gdzie a,b,c sa wpisywane z klawiatury. Z góry dzięki za wszystkie wskazówki! :) Pozdrawiam

oto program który posiadam:

// Znajdywanie miejsc zerowych metoda bisekcji

#include <stdio.h>

// Prototypy funkcji uzytych w programie
float bisekcja(float, float, float);
float f(float);



int main(void)
  {
  // Program glowny
  
  float lewy,prawy,eps,wynik;

  // Wczytanie danych
  printf("Podaj lewy kraniec przedzialu,  lewy = ");
  scanf("%f", &lewy);

  printf("Podaj prawy kraniec przedzialu, prawy = ");
  scanf("%f", &prawy);

  printf("Podaj zadana dokladnosc, eps = ");
  scanf("%f", &eps);

  // Wywolanie funkcji obliczacej miejsce zerowe
  wynik = bisekcja(lewy,prawy,eps);
  printf("%f\n",wynik);

  }


float bisekcja(float lewy, float prawy, float eps)
  {
  // Funkcja oblicza miejsce zerowe funkcji f metoda bisekcji

  float pierwiastek;

  if ( f(lewy)*f(prawy) < 0 ) 
    {
    pierwiastek = lewy;   // Pierwsze przyblizenie pierwiastka

    while( (prawy-lewy) >= eps )  // Liczymy do momentu osiagniecia zadanej dokladnosci
      {
      pierwiastek = (prawy + lewy) / 2.0;  // srodek przedzialu
      if ( f(lewy)*f(pierwiastek) < 0 )
        prawy = pierwiastek;
      else if ( f(pierwiastek)*f(prawy) < 0 )
        lewy = pierwiastek;
      }
    }
  else 
    pierwiastek = -0,0;   // Nie ma pierwiastka w przedziale, zwracamy -0.0

  return(pierwiastek);
  }


float f(float x)
  {
  // Funkcja, ktorej miejsc zerowych szukamy
  return(x*x+x - 1);      // i tu wielomian ma przyjac postac (ax*x+bx+c) gdzie a,b,c maja byc wpisywane z klawiatury 
  }
0

Faktycznie się zapędziłem z tym wyznaczaniem wartości współczynników wewnątrz funkcji f, bo nie zauważyłem, że jest ona używana więcej niż raz.

Na szybko można coś takiego: http://ideone.com/e6xd2

0

Powyższy kod, to Wtf lub perełki. Przy każdej próbie obliczenia wartości funkcji użytkownik będzie wpisywał współczynniki dwumianu.

0

Koledzy i tak dzięki za pomoc, że ktoś coś napisał ! musze przyznać, że ja sie na progaramowaniu nie bardzo znam, ale zauważyłem że jesli rzeczywiscie dopisze sie to co napisał Jacek to to wpisujemy dwukrotnie wspołczynniki dwumianu.

0

@jacek_128, kod jest teraz dużo bardziej sensowny, ale "dziedziczy" błędy oryginału:

  • funkcja bisekcja zwraca 0.0 gdy metoda bisekcji nie znajdzie pierwiastka, jak to odróżnić od sytuacji, gdy 0.0 jest pierwiastkiem?
  • z tego że f(lewy)*f(prawy)>=0 nie wynika, że nie ma pierwiastków, nie ma tylko gwarancji, że metoda bisekcji znajdzie pierwiastek
    (lewy=-2.0, prawy=2.0, f(x)=x2-1, f(lewy)*f(prawy)=9 a pierwiastki są)
      pierwiastek = (prawy + lewy) / 2.0;
      if ( f(lewy)*f(pierwiastek) < 0 )
        prawy = pierwiastek;
      else if ( f(pierwiastek)*f(prawy) < 0 )
        lewy = pierwiastek;

dla lewy = 0.0, prawy=2.0, f(x)=x-1, pierwiastek = 1.0, f(pierwiastek)=0, żaden z warunków: f(lewy)*f(pierwiastek) < 0, f(prawy)*f(pierwiastek) < 0 nie jest spełniony i program w chodzi w nieskończona pętlę

0

Dzieki wszystkim którzy sie wypowiedzieli na temat mojego zadania, byliście nie tylko pomocni ale również skuteczni bo pomogliście (jeszcze raz dzieki) Dzięki Jacek (dużo wniosłeś do tematu).

Temat uważam za pozytywnie zakończony pozdrawiam!!

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