Znajdywanie miejsca zerowe wielomianu

0

Nie mogę poradzić sobie z tym zadaniem:

1.Napisać funkcję std::vector<double> p = get_poly(n), gdzie p jest wektorem współczynników wielomianu, n liczbą elementów do pobrania (rzędem wielomianu+1)

2.Napisać funkcję double res =poly(x,p), gdzie p jest wektorem współczynników wielomianu rzędu n=p.size()-1, a x wartością, dla której należy obliczyć wartość wielomianu

y=p[0]+p[1]*x+p[2]*x^2+..+p[n]*x^n;

3.Napisać funkcję:

vector<double> zeros = zero(x_min,x_max,p, step);
//oraz funkcja pomocnicza
double x = zero_r(x1, x1+step);
funkcja zero(...) przeszukuje zakres od x_min do x_max z krokiem step i zwraca wektor zawierający wszystkie miejsca zerowe wielomianu w tym zakresie.
gdy znajdzie taką para x1 = x_min+k*step i x2 = x1+step, dla której zmienia się znak wielomianu, powinna wywołać dla tego przedziału rekurencyjną funkcję zero_r(bottom,top).
funkcja zero_r(bottom,top) wyznacza kolejne przybliżenia miejsca zerowego metodą przeszukiwania binarnego. W każdym kroku zakres poszukiwań (top-bottom) zmniejsza się o 0.5 i wybierany jest taki przedział, w którym leży miejsce zerowe (wartość wielomianu dla początku i końca przedziału maja różne znaki). Jako warunek stopu proszę przyjąć, że szerokość zakresu będzie <1e-9.

Udało mi się zrobić coś takiego,ale też nie dokładnie jak w poleceniu. Dalej nie wiem co robić.

 #include <iostream>
#include <vector>
#include <string>

using namespace std;
vector<double> get_poly(unsigned n)
{
    vector<double>p(n, 4.0);
    return p;
}

double poly(double x,unsigned n, vector<double>p)
{
    if(n==0)
        return p[0];
    return x*poly(x,n-1,p)+p[n];
}

int main()
{
    unsigned liczba_elementow=3;
    vector<double> p = get_poly(liczba_elementow);
    unsigned n=p.size()-1;
           double res=poly(5,n,p);
           cout<<res<<endl;
        return 0;
}``` 


 Nie rozumiem jak ma działać funkcja zeros i tym bardziej jak ją napisać.
1

Popatrz uważnie na sygnatury funkcji - powinny być zgodne z opisem zadania.
Na przykład powinno być double poly( double x , const vector<double>& p ) a nie jak w kodzie double poly(double x,unsigned n, vector<double>p)
poza tym w tym przypadku nie trzeba używać rekurencji tylko wystarczy:

double poly( double x , const vector<double>& p )
{
    double result {0.0};

    for( size_t i=0 ; i<p.size() ; ++i )
    {
        result += p[i]*pow(x,i);
    }

    return result;
}

Jeżeli chodzi o funkcję zero to zobacz sobie jak wygląda kod na stronie .
Podpowiedź: Wykorzystaj funkcję poly w tym rozwiązaniu.

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