Cześć, robię projekt w matlabie. Mam całość, tyle, że program błędnie liczy ekstrema i punkty przegięcia. Funkcja solve wyrzuca miejsca zerowe 1. i 2. pochodnej, liczy dobrze wartości, ale nie są faktyczne punkty przegięcia i ekstrema, patrząc po wykresie. Wydaje mi się, że powinno być sortowanie tych miejsc zerowych.
Mam jakieś pseudo sortowanie, ale nie działa, wiadomo.
Dzięki.
[code]
clear all; close all;
'Podaj poczatek i koniec zakresu osi X'
xmin = input('xmin = ');
xmax = input('xmax = ');
syms x;
'Podaj wzor funkcji'
y = input('f(x) = ');
ezplot(y, [xmin,xmax]);grid minor; xlabel('os x');ylabel('os y');
title('Wykres funkcji f(x) ');
%Dziedzina
x_min = xmin
x_max = xmax
% Przeciwdziedzina
x = xmin:0.0001:xmax;
y2 = subs(y);
y_min = min(double(y2))
y_max = max(double(y2))
% wartosc srednia
wartosc_srednia = mean(double(y2));
epsilon = 0.000000000001;
if (wartosc_srednia>-epsilon)
if (wartosc_srednia < epsilon)
wartosc_srednia = 0;
else wartosc_srednia = mean(double(y2));
end
end
wartosc_srednia_funkcji = wartosc_srednia
% miejsca zerowe
miejsca_zerowe = double(solve(y))
% Ekstrema
'Wzor pochodnej funkcji'
y1 = diff(y)
'Ekstrema funkcji'
argumenty_ekstremow = double(solve(y1))
x = double(argumenty_ekstremow);
wartosci_ekstremow = double(eval(y))
% punkty przegiecia
'Wzor drugiej pochodnej funkcji'
sortuj(tablica tab)
for i=0 to r-2 do
for j=r-1 downto i+1 do
if (tab[j-1]>tab[j])
zamień elementy tab[j] i tab[j-1]
y2 = diff(y,2)
x = xmin:0.0001:xmax;
punkty_przegiecia = double(solve(y2))
%Funkcja ujemna badz dodatnia (y)
z = zeros(1,1);
z(1) = xmin;
j=2;
for i = 1:length(miejsca_zerowe)
z(j) = miejsca_zerowe(i);
j = j+1;
end
z(j) = xmax;
for i=1:length(z)-1
x = z(i)+epsilon;
y2 = subs(y);
if(y2 > 0)
sprintf('Funkcja jest dodatnia na przedziale <%d,%d>',z(i),z(i+1))
else
sprintf('Funkcja jest ujemna na przedziale <%d,%d>',z(i),z(i+1))
end
end
% monotonicznosc
z = zeros(1,1);
z(1) = xmin;
j=2;
for i=1:length(argumenty_ekstremow)
z(j) = argumenty_ekstremow(i);
j = j+1;
end
z(j) = xmax;
for i = 1:length(z)-1
x = z(i)+epsilon;
y2 = subs(y1);
if(y2 > 0)
sprintf('Funkcja jest rosnaca na przedziale <%d,%d>',z(i),z(i+1))
else
sprintf('Funkcja jest malejaca na przedziale <%d,%d>',z(i),z(i+1))
end
end
[quote]
sortuj(tablica tab)
for i=0 to r-2 do
for j=r-1 downto i+1 do
if (tab[j-1]>tab[j])
zamień elementy tab[j] i tab[j-1]
A tutaj to pseudo sortowanie.
Mam jakieś pseudo sortowanie, ale nie działa, wiadomo.
Dzięki.
[code]
Code: basic4gl
clear all; close all;
'Podaj poczatek i koniec zakresu osi X'
xmin = input('xmin = ');
xmax = input('xmax = ');
syms x;
'Podaj wzor funkcji'
y = input('f(x) = ');
ezplot(y, [xmin,xmax]);grid minor; xlabel('os x');ylabel('os y');
title('Wykres funkcji f(x) ');
%Dziedzina
x_min = xmin
x_max = xmax
% Przeciwdziedzina
x = xmin:0.0001:xmax;
y2 = subs(y);
y_min = min(double(y2))
y_max = max(double(y2))
% wartosc srednia
wartosc_srednia = mean(double(y2));
epsilon = 0.000000000001;
if (wartosc_srednia>-epsilon)
if (wartosc_srednia < epsilon)
wartosc_srednia = 0;
else wartosc_srednia = mean(double(y2));
end
end
wartosc_srednia_funkcji = wartosc_srednia
% miejsca zerowe
miejsca_zerowe = double(solve(y))
% Ekstrema
'Wzor pochodnej funkcji'
y1 = diff(y)
'Ekstrema funkcji'
argumenty_ekstremow = double(solve(y1))
x = double(argumenty_ekstremow);
wartosci_ekstremow = double(eval(y))
% punkty przegiecia
'Wzor drugiej pochodnej funkcji'
sortuj(tablica tab)
for i=0 to r-2 do
for j=r-1 downto i+1 do
if (tab[j-1]>tab[j])
zamień elementy tab[j] i tab[j-1]
y2 = diff(y,2)
x = xmin:0.0001:xmax;
punkty_przegiecia = double(solve(y2))
%Funkcja ujemna badz dodatnia (y)
z = zeros(1,1);
z(1) = xmin;
j=2;
for i = 1:length(miejsca_zerowe)
z(j) = miejsca_zerowe(i);
j = j+1;
end
z(j) = xmax;
for i=1:length(z)-1
x = z(i)+epsilon;
y2 = subs(y);
if(y2 > 0)
sprintf('Funkcja jest dodatnia na przedziale <%d,%d>',z(i),z(i+1))
else
sprintf('Funkcja jest ujemna na przedziale <%d,%d>',z(i),z(i+1))
end
end
% monotonicznosc
z = zeros(1,1);
z(1) = xmin;
j=2;
for i=1:length(argumenty_ekstremow)
z(j) = argumenty_ekstremow(i);
j = j+1;
end
z(j) = xmax;
for i = 1:length(z)-1
x = z(i)+epsilon;
y2 = subs(y1);
if(y2 > 0)
sprintf('Funkcja jest rosnaca na przedziale <%d,%d>',z(i),z(i+1))
else
sprintf('Funkcja jest malejaca na przedziale <%d,%d>',z(i),z(i+1))
end
end
[quote]
Code: c
sortuj(tablica tab)
for i=0 to r-2 do
for j=r-1 downto i+1 do
if (tab[j-1]>tab[j])
zamień elementy tab[j] i tab[j-1]
A tutaj to pseudo sortowanie.