//Zadanie I od Rokickiego
//program oczywiście nie policzy nic dopóki nie stworzycie pliku interp.txt
#include <stdio.h>
#include <math.h>
double intlagr(double x[10], double y[10], int n, double t);
void main()
{
double t,w, x[10], y[10];
int n, i;
FILE *plik;
plik = fopen ("interp.txt","r");
fscanf(plik,"%d\n",&n);
for(i=0;i<=n;i++)
{
fscanf(plik,"%lf %lf\n",&x[i],&y[i]);
}
printf("Podaj argument dla ktorego chcesz znalezc wartosc wielomianu interp. :");
scanf("%lf",&t);
w=intlagr(x,y,n,t);
printf("w(%lf) = %lf\n",t,w);
fclose(plik);
}
double intlagr(double x[50], double y[50], int n, double t)
{
double l, yy;
int i, k;
yy=0.0;
for(i=0;i<=n;i++)
{
l=1.0;
for(k=0;k<=n;k++)
{
if(i!=k) l=l*((t-x[k])/(x[i]-x[k]));
}
yy=yy+l*y[i];
}
return yy;
}
//Zadanie 2 od Rokickiego
(nie mozna przeprowadzić wielomianu przez te punkty poniewaz każdy wielomian jest funkcjąa z definicji funkcji wynika ze dla jednego argumentu nie moze być więcej niż jedna wartość
czyli nie może być (2,3) i (2,5)
)
//Zadanie 3 od Rokickiego
#include <stdio.h>
#include <math.h>
double alfa;
double f(double x)
{
double p;
p=pow((pow(2.0,alfa)+cos(alfa*x)),1.0/3.0);
return p;
}
double simpson(double a, double b, double (*f)(double x), int n);
void main()
{
double cn, a, b, alfak, alfa0, dalfa;
int n;
printf("Podaj a, b, alfa0, alfak, dalfa,n:");
scanf("%lf %lf %lf %lf %lf %d",&a,&b,&alfa0,&alfak,&dalfa,&n);
alfa = alfa0;
while(alfa<=alfak)
{
cn = simpson(a,b,f,n);
printf("cn(%lf) = %lf\n",alfa,cn);
alfa = alfa + dalfa;
}
}
double simpson(double a, double b, double (*f)(double x), int n)
{
double value;
double h, x, sum;
int i;
int nc; // oznaczenie dla liczby wezlow wewnetrznych
nc = abs( n / 2 ) * 2;
h = (b - a) / (float) nc; // krok calkowania
sum = 0.0;
for( i=1; i<nc-1; i+=2 ) {
x = a + (float) i * h;
sum += 4.0*f(x) + 2.0*f(x+h);
}
value = ( f(a) + sum + 4.0*f(b-h) + f(b) ) * h / 3.0;
return value;
}
//Zadanie 4 od Rokickiego
#include <stdio.h>
#include <math.h>
double alfa;
double f(double x)
{
double p;
p=exp( -sin(x) * sin(x) - (alfa *x) );
return p;
}
double simpson(double a, double b, double (*f)(double x), int n);
void main()
{
double cn, a, b, alfak, alfa0, dalfa;
int n;
printf("Podaj a, b, alfa0, alfak, dalfa,n:");
scanf("%lf %lf %lf %lf %lf %d",&a,&b,&alfa0,&alfak,&dalfa,&n);
alfa = alfa0;
while(alfa<=alfak)
{
cn = simpson(a,b,f,n);
printf("cn(%lf) = %lf\n",alfa,cn);
alfa = alfa + dalfa;
}
}
double simpson(double a, double b, double (*f)(double x), int n)
{
double value;
double h, x, sum;
int i;
int nc; // oznaczenie dla liczby wezlow wewnetrznych
nc = abs( n / 2 ) * 2;
h = (b - a) / (float) nc; // krok calkowania
sum = 0.0;
for( i=1; i<nc-1; i+=2 ) {
x = a + (float) i * h;
sum += 4.0*f(x) + 2.0*f(x+h);
}
value = ( f(a) + sum + 4.0*f(b-h) + f(b) ) * h / 3.0;
return value;
}
//Zadanie 5 od Rokickiego
//program oczywiście nie policzy nic dopóki nie stworzycie pliku aa.txt zawierającego 50 węzłów :>
#include <stdio.h>
#include <math.h>
double trapez(double x[50], double y[50], int n);
void main()
{
double cn, x[50], y[50];
int n,i;
FILE *plik;
plik = fopen ("wezly","r");
fscanf(plik,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(plik,"%lf %lf\n",&x[i],&y[i]);
}
cn = trapez(x,y,n);
printf("cn=%lf\n",cn);
fclose(plik);
}
double trapez(double x[50], double y[50], int n)
{
double sum0, sum;
int i;
sum0 = 0.0;
for (i=1;i<n;i++)
{
sum = ( y[i] + y[i+1] )*( x[i+1] - x[i] ) / 2.0;
sum = sum0 +sum;
}
return sum;
}
//Zadanie 6 od Rokickiego
Troche to jest jeszcze niedopracowane ale nie chce mi sie już w to wnikać
#include <stdio.h>
#include <math.h>
double bisekcja(double a, double b, double (*f)(double x), double eps);
double sieczna(double a, double b, double (*f)(double x), double eps);
double styczna(double a, double (*f)(double x), double eps);
double f(double x)
{
return (2*sin(x)-(1.0/x));
}
double fp(double x)
{
return (2*cos(x)+(1.0/(x*x)));
}
void main()
{
double x0, x0si, x0st, a0, b0, zm, a[4], b[4], eps;
int i, k, m;
printf("podaj a0, b0, zm, m, eps:");
scanf("%lf %lf %lf %d %lf",&a0,&b0,&zm,&m,&eps);
k=0;
a[0]=a0;
for(i=1;;i++)
{
if(f(a0) * f(b0)>0.0) b0 = b0 + zm;
else
{
b[k] = b0;
a0 = b0;
printf("(%lf;%lf)\n",a[k],b[k]);
a[k + 1] = b0;
k = k + 1;
}
if(k>m) break;
}
for(i=0;i<k;i++)
{
a0=a[i];
b0=b[i];
x0=bisekcja(a0,b0,f,eps);
printf("x0=%lf %lf\n",x0,f(x0));
x0si=sieczna(a0,b0,f,eps);
printf("x0si=%lf %lf\n",x0si,f(x0si));
x0st=styczna(a0,f,eps);
printf("x0st=%lf %lf\n",x0st,f(x0st));
}
}
double bisekcja(double a, double b, double (*f)(double x), double eps)
{
double x0;
while(fabs(b-a)>eps)
{
x0=(a+b)/2.0;
if(f(x0)*f(a)<0) b=x0;
else a=x0;
}
return x0;
}
double styczna(double a, double (*f)(double x), double eps)
{
double x0, xch;
x0=a-(f(a)/fp(a));
while(fabs(a-x0)>eps)
{
x0=a-(f(a)/fp(a));
xch=x0;
x0=a;
a=xch;
}
return x0;
}
double sieczna(double a,double b,double(*f)(double x),double eps)
{
double x,x0,dx;
x0=a;
do
{
x=a-f(a)*(b-a)/(f(b)-f(a));
if(f(a)*f(x)<0.0) b=x;
else a=x;
x0=x;
}
while(fabs(x-x0)>eps);
return x;
}
Zadanie 7 rokicki
#include <stdio.h>
#include <math.h>
double bisekcja(double a, double b, double (*f)(double x), double eps);
double alfa;
double f(double x)
{
return (exp(-x)-x*x*x-alfa);
}
void main()
{
double a, b, eps, x[601], y[601], alfa0, alfak, dalfa;
double sum0, sum;
int i,n;
FILE *plik;
plik=fopen("dane31.dat","w");
printf("Podaj a, b, eps, alfak, alfa0, dalfa: ");
scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&eps,&alfak,&alfa0,&dalfa);
i=0;
alfa = alfa0;
while(alfa<=alfak)
{
x[i] = alfa;
y[i] = bisekcja(a,b,f,eps);
fprintf(plik,"x[%d]=%lf y[%d]=%lf\n",i,x[i],i,y[i]);
alfa = alfa + dalfa;
i=i+1;
}
sum0 = 0.0;
n = (b-a) / dalfa;
for (i=0;i<=n+1;i++)
{
sum = ( y[i] + y[i+1] )*( x[i+1] - x[i] ) / 2.0;
fprintf(plik,"sum=%lf\n",sum);
sum = sum0 +sum;
}
printf("cn=%lf\n",sum);
}
double bisekcja(double a, double b, double (*f)(double x), double eps)
{
double x0;
while(fabs(b-a)>eps)
{
x0=(a+b)/2.0;
if(f(x0)*f(a)<0) b=x0;
else a=x0;
}
return x0;
}
/Cwiczenie 1
#include <stdio.h>
#include <math.h>
double trapez(double a, double b, double (*f)(double x), int n);
double simpson(double a, double b, double (*f)(double x), int n);
double f(double x)
{
return (1.0/x);
}
void main()
{
double bs, cns, bt, ca, cnt, a, b;
int n, i;
printf ( " Podaj a,b,n: ") ;
scanf ( "%lf %lf %d" ,&a, &b ,&n) ;
for(i=2;i<n;i=i*2)
{
cns = simpson ( a , b , f , i );
cnt = trapez ( a , b , f , i );
ca = ( sin(b) - ( (1.0 / 2.0) * b * b ) - sin(a) + ( (1.0 / 2.0 ) * a * a ) );
//printf("ca = %lf \n",ca);
//printf("Calka funkcji f(x) w przedziale <%lf,%lf> wynosi : %lf \n", a, b, cnt);
bt = fabs (ca - cnt);
bs = fabs (ca - cns);
printf("bt=%lf bs=%lf\n",bt,bs);
}
}
double trapez(double a, double b, double (*f)(double x), int n)
{
double h, x, sum;
int i;
h = ( b - a ) / ( float ) n;
sum = 0.0;
for(i = 1;i < n;i++)
{
x = a + i * h;
sum = sum + f(x);
}
sum=( f(a) + 2.0 * sum + f(b) )* h / 2.0;
return sum;
}
double simpson(double a, double b, double (*f)(double x), int n)
{
double value;
double h, x, sum;
int i;
int nc; // oznaczenie dla liczby wezlow wewnetrznych
nc = abs( n / 2 ) * 2;
h = (b - a) / (float) nc; // krok calkowania
sum = 0.0;
for( i=1; i<nc-1; i+=2 ) {
x = a + (float) i * h;
sum += 4.0*f(x) + 2.0*f(x+h);
}
value = ( f(a) + sum + 4.0*f(b-h) + f(b) ) * h / 3.0;
return value;
}
//Cwiczenie 2
#include <stdio.h>
#include <math.h>
double trapez(double a, double b, double (*f)(double x), int n);
double simpson(double a, double b, double (*f)(double x), int n);
double lagrange(double x[50], double y[50], int n, double t);
double f1(double x)
{
return pow(x,(1.0/2.0));
}
double f2(double x)
{
return pow(pow(x,(1.0/2.0)),3);
}
void main()
{
double x[50],y[50],t,yy,h,cnt1, cnt2, cns1, cns2, a, b;
int i, n;
FILE *plik;
plik=fopen("lagr.dat","w");
printf("Podaj a, b, n: ");
scanf("%lf %lf %d",&a,&b,&n);
cnt1 = trapez( a, b, f1, n );
cnt2 = trapez( a, b, f2, n );
cns1 = simpson( a, b, f1, n );
cns2 = simpson( a, b, f2, n );
printf("cnt1 = %lf \n",cnt1);
printf("cnt2 = %lf \n",cnt2);
printf("cns1 = %lf \n",cns1);
printf("cns2 = %lf \n",cns2);
h=(4.0/(n-1));
for (i=1;i<=n;i++)
{
x[i] = -2 + i * h;
y[i] = exp(-x[i]*x[i]);
}
for(i=1;i<=4*n-4;i++)
{
t=-2+i;
yy=lagrange(x, y, n, t);
fprintf(plik,"%lf %lf\n",t,yy);
printf("yy(%lf)=%lf\n",t,yy);
}
}
double lagrange(double x[50], double y[50], int n, double t)
{
double yy,l;
int i,k;
yy=0.0;
for (i=1;i<=n;i++)
{
l=1;
for(k=1;k<=n;k++)
{
if(i!=k) l=l*((t-x[k])/(x[i]-x[k]));
}
yy=yy+l*y[i];
}
return yy;
}
double trapez(double a, double b, double (*f)(double x), int n)
{
double x, sum, h;
int i;
h=(b-a)/n;
sum = 0;
for (i=1;i<n;i++)
{
x = a + i * h;
sum = sum + f(x);
}
sum = ( f(a) + 2 * sum + f(b) )*(h/2.0);
return sum;
}
double simpson(double a, double b, double (*f)(double x), int n)
{
double value;
double h, x, sum;
int i;
int nc; // oznaczenie dla liczby wezlow wewnetrznych
nc = abs( n / 2 ) * 2;
h = (b - a) / (float) nc; // krok calkowania
sum = 0.0;
for( i=1; i<nc-1; i+=2 ) {
x = a + (float) i * h;
sum += 4.0*f(x) + 2.0*f(x+h);
}
value = ( f(a) + sum + 4.0*f(b-h) + f(b) ) * h / 3.0;
return value;
}
//interpolacja lagrangea punkt 3 z Cwiczenia 2 (oddzielnie od reszty programu z Cwiczenia 2)
#include <stdio.h>
#include <math.h>
double lagrange(double x[50], double y[50], int n, double t);
void main()
{
double yy, x[50], y[50], t, h;
int i, n;
printf("Podaj n: ");
scanf("%d",&n);
h=4.0/(n-1);
for(i=0;i<=n;i++)
{
x[i] = -2.0 + i*h;
y[i] = exp(-x[i] * x[i]);
}
for(i=0;i<=4*n-4;i++)
{
t = -2.0 + ((h * i) / 4.0);
yy=lagrange(x,y,n,t);
printf("t=%lf yy=%lf\n",t,yy);
}
}
double lagrange(double x[50], double y[50], int n, double t)
{
double l, yy;
int i, k;
yy=0.0;
for(i=0;i<=n;i++)
{
l=1.0;
for(k=0;k<=n;k++)
{
if(i!=k) l=l*((t-x[k])/(x[i]-x[k]));
}
yy=yy+l*y[i];
}
return yy;
}
//Ćwiczenie 3 Punkt pierwszy z "Zadania do wykonania"
#include <stdio.h>
#include <math.h>
double bisek(double a, double b, double (*f)(double x), double eps, int *itb);
double f(double x)
{
return (cos(x)-x);
}
void main()
{
double x0, a, b, eps;
int n;
printf("Podaj a, b, eps:");
scanf("%lf %lf %lf",&a,&b,&eps);
while(f(a)*f(b)>0.0)
{
printf("Brak miejsc zerowych na tym przedziale, Podaj a, b:");
scanf("%lf %lf",&a,&b);
}
x0=bisek(a,b,f,eps,&n);
printf("x0=%lf\n",x0);
printf("Liczba iteracja dla eps = %lf wynosi %d\n",eps,n);
}
double bisek(double a, double b, double (*f)(double x), double eps, int *itb)
{
double x0;
*itb = 0;
while(fabs(b-a)>eps)
{
x0=(a+b)/2.0;
if(f(x0)*f(a)<0) b=x0;
else a=x0;
*itb = *itb + 1;
}
return x0;
}
// Cwiczenie 3 punkt 2 z "Zadania do wykonania"
#include <stdio.h>
#include <math.h>
double bisek(double a, double b, double (*f)(double x), double eps, int *itb);
double f(double x)
{
return (cos(x)-x);
}
void main()
{
double x0, a, b, eps0, eps;
int i,n;
FILE *plik;
plik=fopen("dane.dat","w");
printf("Podaj a, b, eps0:");
scanf("%lf %lf %lf",&a,&b,&eps0);
while(f(a)*f(b)>0.0)
{
printf("Brak miejsc zerowych na tym przedziale, Podaj a, b:");
scanf("%lf %lf",&a,&b);
}
for(i=-20;i<=-3;i++)
{
eps = eps0;
eps = pow(eps,i);
x0=bisek(a,b,f,eps,&n);
printf("x0=%lf\n",x0);
printf("%d %lf\n",n,eps);
fprintf(plik,"%d %lf\n",n,eps);
}
}
double bisek(double a, double b, double (*f)(double x), double eps, int *itb)
{
double x0;
*itb = 0;
while(fabs(b-a)>eps)
{
x0=(a+b)/2.0;
if(f(x0)*f(a)<0) b=x0;
else a=x0;
*itb = *itb + 1;
}
return x0;
}
//Punkt 3 z Zadania do wykonania . Nie jetsem pewny co do metody sstycznych bo sam ją pisałem (ale liczy dobrze).
#include <stdio.h>
#include <math.h>
double bisek(double a, double b, double (*f)(double x), double eps, int *itb);
double styczna(double a, double (*f)(double x), double eps, int *itst);
double sieczna(double a, double b, double (*f)(double x), double eps, int *itsi);
double f(double x)
{
return (cos(x)-x);
}
//pochodna cos(x)-x:
double fp(double x)
{
return (-sin(x)-1);
}
void main()
{
double x0, x0si, x0st, a, b, eps0, eps;
int i, n, nsi, nst;
FILE *plik,*plik1,*plik2;
plik=fopen("dane.dat","w");
plik1=fopen("dane1.dat","w");
plik2=fopen("dane2.dat","w");
printf("Podaj a, b, eps0:");
scanf("%lf %lf %lf",&a,&b,&eps0);
while(f(a)*f(b)>0.0)
{
printf("Brak miejsc zerowych na tym przedziale, Podaj a, b:");
scanf("%lf %lf",&a,&b);
}
for(i=-20;i<=-3;i++)
{
eps = eps0;
eps = pow(eps,i);
x0 = bisek(a,b,f,eps,&n);
printf("x0=%lf\n",x0);
printf("%d %lf\n",n,eps);
fprintf(plik,"n=%d %lf\n",n,eps);
x0si = sieczna(a,b,f,eps,&nsi);
x0st = styczna(a,f,eps,&nst);
printf("x0si=%lf\n",x0si);
printf("x0st=%lf\n",x0st);
printf("nsi=%d %lf\n",nsi,eps);
fprintf(plik1,"%d %lf\n",nsi,eps);
printf("nst=%d %lf\n",nst,eps);
fprintf(plik2,"%d %lf\n",nst,eps);
}
}
double bisek(double a, double b, double (*f)(double x), double eps, int *itb)
{
double x0;
*itb = 0;
while(fabs(b-a)>eps)
{
x0=(a+b)/2.0;
if(f(x0)*f(a)<0) b=x0;
else a=x0;
*itb = *itb + 1;
}
return x0;
}
double sieczna(double a, double b, double (*f)(double x), double eps, int *itsi)
{
double x0;
*itsi=0;
while(fabs(b-a)>eps)
{
x0=a-f(a)*((b-a)/(f(b) - f(a)));
if(f(a)*f(b)<0.0) b=x0;
else a=x0;
*itsi = *itsi + 1;
}
return x0;
}
double styczna(double a, double (*f)(double x), double eps, int *itst)
{
double x0, xch;
*itst=0;
x0=a-(f(a)/fp(a));
while(fabs(a-x0)>eps)
{
x0=a-(f(a)/fp(a));
xch=x0;
x0=a;
a=xch;
*itst = *itst + 1;
}
return x0;
}