Pilnie potrzebuję programu (gdyż sama już nie zdążę go napisać, a wcześniej nauczyć się odpowiednich rzeczy) lub gruntownej pomocy w jego napisaniu wykonujący podstawowe operacie na wielomianach napisany w C++
Będę wdzięczna za każdą pomoc, za każdą, nawet najmniejszą, część programu lub wskazówki do nich.
Bardzo proszę o pomoc!
[C++] Program wykonujący operacje na wielomianach
[C++] Program wykonujący operacje na wielomianach
Ostatnio zmieniony 9 sty 2012, o 22:41 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Powód: Poprawa wiadomości.
-
- Użytkownik
- Posty: 7330
- Rejestracja: 14 lut 2008, o 08:31
- Płeć: Mężczyzna
- Lokalizacja: Z Bielskia-Białej
- Podziękował: 6 razy
- Pomógł: 961 razy
[C++] Program wykonujący operacje na wielomianach
Algorytmy podam.
1.Wpisz stopień wielomianu
2.Wpisz współczynniki wielomianu
3.Podaj działanie jakie ma wykonać
A.Dodawanie(odejmowanie)
Jeśli stopnie są równe dodaj(odejmij) po współrzędnych
Jeśli nie to do tego wielomianu dodaj sztucznie 0 razy odpowiedni jednomian
4.Mnożenie.pomnóż współczynniki każdy z każdym i dodaj stopnie jednomianów przed którymi stoją te współczynniki.Iloczyny dla których mamy taką samą liczbę stopni dodajemy
5.Jeżeli stopień wielomianu-dzielnika jest większy niż stopień wielomianu-dzielnej piszesz
iloraz 0 i reszta 0
6.Jeśli nie Najwyższy współczynnik wielomianu-dzielnej dzielisz przez najwyższy dzielnik wielomianu- dzielnikawynik piszesz do schowka. Teraz ten element ze schowka mnożysz przez wielomian -dzielnik - wynik odejmujesz od wielomianu dzielnej.
Robisz to do momentu,aż masz sytuację z punktu 5.
1.Wpisz stopień wielomianu
2.Wpisz współczynniki wielomianu
3.Podaj działanie jakie ma wykonać
A.Dodawanie(odejmowanie)
Jeśli stopnie są równe dodaj(odejmij) po współrzędnych
Jeśli nie to do tego wielomianu dodaj sztucznie 0 razy odpowiedni jednomian
4.Mnożenie.pomnóż współczynniki każdy z każdym i dodaj stopnie jednomianów przed którymi stoją te współczynniki.Iloczyny dla których mamy taką samą liczbę stopni dodajemy
5.Jeżeli stopień wielomianu-dzielnika jest większy niż stopień wielomianu-dzielnej piszesz
iloraz 0 i reszta 0
6.Jeśli nie Najwyższy współczynnik wielomianu-dzielnej dzielisz przez najwyższy dzielnik wielomianu- dzielnikawynik piszesz do schowka. Teraz ten element ze schowka mnożysz przez wielomian -dzielnik - wynik odejmujesz od wielomianu dzielnej.
Robisz to do momentu,aż masz sytuację z punktu 5.
- Mariusz M
- Użytkownik
- Posty: 6909
- Rejestracja: 25 wrz 2007, o 01:03
- Płeć: Mężczyzna
- Lokalizacja: 53°02'N 18°35'E
- Podziękował: 2 razy
- Pomógł: 1246 razy
[C++] Program wykonujący operacje na wielomianach
Jeżeli chcesz kodu to
dodawanie/odejmowanie
mnożenie
dzielenie
pierwiastki
numerycznie znajdziesz na stronie bosaka
dodawanie/odejmowanie
Kod: Zaznacz cały
void addpoly(int deg,double* a,double* b,double* c){
int i;
for(i=0;i<=deg;i++)
c[i]=a[i]+b[i];
}
Kod: Zaznacz cały
void mulpoly(int deg1,deg2,double* a,double* b,double* c){
int i,j;
for(i=0;i<=deg1+deg2;i++)
c[i]=0;
for(i=0;i<=deg1;i++)
for(j=0;j<=deg2;j++)
c[i+j]+=a[i]*b[j];
}
dzielenie
Kod: Zaznacz cały
void divpoly(double* u, int n, double* v, int nv, double* q, double* r)
{
int k,j;
for (j=0;j<=n;j++) {
r[j]=u[j];
q[j]=0.0;
}
for (k=n-nv;k>=0;k--) {
q[k]=r[nv+k]/v[nv];
for (j=nv+k-1;j>=k;j--) r[j] -= q[k]*v[j-k];
}
for (j=nv;j<=n;j++) r[j]=0.0;
}
Kod: Zaznacz cały
#include <iostream>
#include <iomanip>
#include <complex>
#include <conio.h>
using namespace std;
double eps=1e-12;
complex<double> horner(int,complex<double>[],complex<double>);
int linear(complex<double>[],complex<double>[]);
int quadratic(complex<double>[],complex<double>[]);
int cubic(complex<double>[],complex<double>[]);
int quartic01(complex<double>[],complex<double>[]);
int quartic02(complex<double>[],complex<double>[]);
int main(){
char ch;
int i,w,n;
complex<double> a[5],x[5];
do{
cout.precision(12);
cout<<"Rozwiazywanie rownan czwartego stopnia"<<endl;
cout<<"1. Metoda Niccolo Fontany "<<endl;
cout<<"2. Metoda Lodovico Ferrariego"<<endl;
cout<<endl;
cin>>w;
switch(w){
case 1:{
cout<<"Podaj wspolczynniki"<<endl;
for(i=4;i>=0;i--){
cout<<"a["<<i<<"]=";
cin>>a[i];
}
cout<<endl;
n=quartic01(a,x);
for(i=1;i<=n;i++)
cout<<"x["<<i<<"]="<<x[i]<<endl;
cout<<endl;
break;
}
case 2:{
cout<<"Podaj wspolczynniki"<<endl;
for(i=4;i>=0;i--){
cout<<"a["<<i<<"]=";
cin>>a[i];
}
cout<<endl;
n=quartic02(a,x);
for(i=1;i<=n;i++)
cout<<"x["<<i<<"]="<<x[i]<<endl;
cout<<endl;
break;
}
default : cout<<"Brak metody . Podaj liczbe od 1 do 2"<<endl;
}
ch=getch();
}
while(ch!=27);
return 0;
}
complex<double> horner(int n,complex<double> a[],complex<double> x){
int i;
complex<double> s=complex<double>(0.0,0.0);
for(i=n;i>=0;i--)
s=s*x+a[i];
return s;
}
int linear(complex<double> a[],complex<double> x[]){
int n=0;
if(a[1]!=complex<double>(0.0,0.0)){
x[1]=complex<double>(-a[0]/a[1]);
n=1;
}
return n;
}
int quadratic(complex<double> a[],complex<double> x[]){
int i,n;
complex<double> delta;
if(a[2]==complex<double>(0.0,0.0)) return linear(a,x);
else{
for(i=1;i<=2;i++)
x[i]=complex<double>(-a[1]/(2.0*a[2]));
delta=pow(a[1],2)-4.0*a[2]*a[0];
x[1]-=complex<double>(sqrt(delta)/(2.0*a[2]));
x[2]+=complex<double>(sqrt(delta)/(2.0*a[2]));
n=2;
return n;
}
}
int cubic(complex<double> a[],complex<double> x[]){
int i,j,n;
complex<double> p,q;
complex<double> b[3],t[3],e[3];
if(a[3]==complex<double>(0.0,0.0)) return quadratic(a,x);
else{
for(i=0;i<3;i++)
e[i]=exp(complex<double>(0.0,2.0*i*M_PI/3.0));
for(i=1;i<=3;i++)
x[i]=complex<double>(-a[2]/(3.0*a[3]));
p=complex<double>((3.0*a[3]*a[1]-pow(a[2],2))/(9.0*pow(a[3],2)));
q=complex<double>((2.0*pow(a[2],3)-9.0*a[3]*a[2]*a[1]+27.0*pow(a[3],2)*a[0])/(54.0*pow(a[3],3)));
b[2]=complex<double>(1.0,0.0);
b[1]=2.0*q;
b[0]=-pow(p,3);
quadratic(b,t);
t[1]=pow(t[1],1.0/3.0);
t[2]=pow(t[2],1.0/3.0);
j=0;
while(abs(e[j/3]*t[1]*e[j%3]*t[2]+p)>=eps) j++;
t[1]*=e[j/3];
t[2]*=e[j%3];
x[1]+=(t[1]+t[2]);
x[2]+=(e[1]*t[1]+e[2]*t[2]);
x[3]+=(e[2]*t[1]+e[1]*t[2]);
n=3;
return n;
}
}
int quartic01(complex<double> a[],complex<double> x[]){
int i,n;
complex<double> p,q,r;
complex<double> b[4],t[4];
if(a[4]==complex<double>(0.0,0.0)) return cubic(a,x);
else{
for(i=1;i<=4;i++)
x[i]=complex<double>(-a[3]/(4.0*a[4]));
p=complex<double>((8.0*a[4]*a[2]-3.0*pow(a[3],2))/(8.0*pow(a[4],2)));
q=complex<double>((pow(a[3],3)-4.0*a[4]*a[3]*a[2]+8.0*pow(a[4],2)*a[1])/(8.0*pow(a[4],3)));
r=complex<double>((16.0*a[4]*pow(a[3],2)*a[2]+256.0*pow(a[4],3) *a[0]-3.0*pow(a[3],4)-64.0*pow(a[4],2)*a[3]*a[1])/(256.0*pow(a[4],4)));
if(abs(q)<eps){
b[2]=complex<double>(1.0,0.0);
b[1]=p;
b[0]=r;
quadratic(b,t);
x[1]-=sqrt(t[1]);
x[2]+=sqrt(t[1]);
x[3]-=sqrt(t[2]);
x[4]+=sqrt(t[2]);
}
else{
b[3]=complex<double>(1.0,0.0);
b[2]=2.0*p;
b[1]=pow(p,2)-4.0*r;
b[0]=-pow(q,2);
cubic(b,t);
for(i=1;i<=3;i++)
t[i]=sqrt(t[i]);
if(abs(t[1]*t[2]*t[3]+q)>eps) t[3]=-t[3];
x[1]+=0.5*(t[1]+t[2]+t[3]);
x[2]+=0.5*(t[1]-t[2]-t[3]);
x[3]+=0.5*(-t[1]+t[2]-t[3]);
x[4]+=0.5*(-t[1]-t[2]+t[3]);
}
n=4;
return n;
}
}
int quartic02(complex<double> a[],complex<double> x[]){
int i,n;
complex<double> p,q,r;
complex<double> ua[4],ux[4];
complex<double> b1[3],x1[3];
complex<double> b2[3],x2[3];
if(a[4]==complex<double>(0.0,0.0)) return cubic(a,x);
else{
p=complex<double>((8.0*a[4]*a[2]-3.0*pow(a[3],2))/(8.0*pow(a[4],2)));
q=complex<double>((pow(a[3],3)-4.0*a[4]*a[3]*a[2]+8.0*pow(a[4],2)*a[1])/(8.0*pow(a[4],3)));
r=complex<double>((16.0*a[4]*pow(a[3],2)*a[2]+256.0*pow(a[4],3)* a[0]-3.0*pow(a[3],4)-64.0*pow(a[4],2)*a[3]*a[1])/(256.0*pow(a[4],4)));
for(i=1;i<=4;i++)
x[i]=complex<double>(-a[3]/(4.0*a[4]));
ua[3]=complex<double>(1.0,0.0);
ua[2]=-p;
ua[1]=-4.0*r;
ua[0]=4.0*p*r-pow(q,2);
cubic(ua,ux);
if(abs(ux[1]-p)<eps){
b1[2]=complex<double>(1.0,0.0);
b1[1]=p;
b1[0]=r;
quadratic(b1,x1);
x[1]-=sqrt(x1[1]);
x[2]+=sqrt(x1[1]);
x[3]-=sqrt(x1[2]);
x[4]+=sqrt(x1[2]);
}
else{
b1[2]=complex<double>(1.0,0.0);
b1[1]=-sqrt(ux[1]-p);
b1[0]=complex<double>(ux[1]/2.0)+complex<double>(q*sqrt(ux[1]-p)/(2.0*(ux[1]-p)));
b2[2]=complex<double>(1.0,0.0);
b2[1]=sqrt(ux[1]-p);
b2[0]=complex<double>(ux[1]/2.0)-complex<double>(q*sqrt(ux[1]-p)/(2.0*(ux[1]-p)));
quadratic(b1,x1);
quadratic(b2,x2);
x[1]+=x1[1];
x[2]+=x1[2];
x[3]+=x2[1];
x[4]+=x2[2];
}
n=4;
return n;
}
}