Rozwiazywanie nieliniowych rownan algebraicznych

Transkrypt

Rozwiazywanie nieliniowych rownan algebraicznych
% Przyklad 5.1
clear all
warning off
x_dokl=-1;
% rozwiazanie dokladne
b=x_dokl*0.95; % wartosc funkcji dla b jest dodatnia
a=x_dokl*1.07; % wartosc funkcji dla a jest ujemna
deltax=(b-a)/2; % to jest max mozliwy blad rozwiazania
dokladnosc=1e-4;
iter=0;
%Metoda bisekcji
while deltax>dokladnosc
iter=iter+1;
deltax=b-a;
x=(a+b)/2;
dx_bis(iter)=abs(x_dokl-x);
% rzeczywisty blad rozwiazania
if (funkcja51(x)*funkcja51(a)>0) % regula metody bisekcji wzor(5.3)
a=x;
else b=x;
end
end
figure(1)
hold off
semilogy(dx_bis,':x')
hold on
% Metoda siecznych
xbs=x_dokl*0.99; % x bardzo stary
xs=x_dokl*1.05;
% x stary
deltax=abs(funkcja51(x));
dokladnosc=1e-15;
iter=0;
while deltax>dokladnosc
iter=iter+1;
xnowy=xs-(xs-xbs)/(funkcja51(xs)-funkcja51(xbs))*funkcja51(xs); % wzor (5.5)
deltax=abs(funkcja51(xnowy));
xbs=xs;
xs=xnowy;
dx_siecz(iter)=abs(x_dokl-xnowy); % rzeczywisty blad rozwiazania
end
semilogy(dx_siecz,':*r')
% Metoda stycznych
x=x_dokl*1.05;
% punkt poczatkowy
deltax=abs(funkcja51(x));
dokladnosc=1e-15;
iter=0;
while deltax>dokladnosc
iter=iter+1;
xstary=x;
x=xstary-funkcja51(xstary)/funkcjapochodna51(xstary);
% wzor (5.4)
deltax=funkcja1(x);
dx_stycz(iter)=abs(x_dokl-x);
end
semilogy(dx_stycz,':ok')
legend('metoda bisekcji','metoda siecznych','metoda stycznych');
title('Porownanie bledow w kolejnych iteracjach dla roznych metod')
xlabel('numer iteracji')
ylabel('blad bezwzgledny rozwiazania')
function f=funkcja51(x)
% funkcja do przykladu 5.1
f=x.*x-x-2;
function f=funkcjapochodna51(x)
% funkcja pochodna do przykladu 5.1
f=2*x-1;
%Zadanie 5.1.
function z=zad51(f)
% Rozwiazanie ukladu poprzez sprowadzenie do jednego rownania
% wzgledem czestotliwosci
c=3e+8;
a=2.5e-2;
L=2.5e-2;
h=3e-3;
epsilonr=10;
u1=(2*pi*f).^2/c/c;
u2=3.83171^2/a/a;
k2=u1*epsilonr-u2;
k=k2.^(0.5);
k02=u1-u2;
k0=k02.^(0.5);
z=tan(k*h)./k+tan(k0*(L-h))./k0;
% Aby uzyskac rozwiazanie nalezy wywolac funkcje fzero jak nizej
% fzero('zad51',8e+9)
% Przyklad 5.2
clear all
close all
x_start_1=[3.5,-2];
rozw1=fsolve('uklad52',x_start_1)
pause(2)
x_start_2=[2,2];
rozw2=fsolve('uklad52',x_start_2)
pause(2)
[x,y]=meshgrid(0:0.05:5,-3:0.05:2);
z=uklad52v2(x,y);
mesh(x,y,z);
function f=uklad52(x)
% x1=x(1)
% x2=x(2)
f(1)=sin(x(1))+x(2).^2-2;
f(2)=x(1)+2.^(x(2))-4;
function z=uklad52v2(x,y)
% J(x1,x2) do narysowania wykresu
f=(sin(x)+y.^2-2);
f=f.*f;
g=x+2.^(y)-4;
g=g.*g;
z=(f+g).^(0.5);
% Przyklad 5.3
% Rozwiazanie po przeksztalceniu ukladu w funkcje jednej zmiennej
Ud=fzero('f53',0)
k=1;
jg=1;
R1=10;
id=k*Ud*(Ud*Ud/3-3*Ud/2+2)
Udr=Ud;
idr=id;
pause
% rozwiazanie ukladu dla 1-go pnktu startowego
r1=fsolve('u53',[2,0.5]);
Ud=r1(1)
id=r1(2)
pause
% rozwiazanie ukladu dla 2-go pnktu startowego
r2=fsolve('u53',[0.2,0.05]);
Ud=r2(1)
id=r2(2)
%graficzne rozwiazanie
Ud=(0:0.1:3);
id=k*Ud.*(Ud.*Ud/3-3*Ud/2+2);
hold off
plot(Ud,id)
id=jg-Ud/R1;
hold on
plot(Ud,id,'.r')
h=line([Udr Udr],[0 idr]);
set(h,'Color','g','LineStyle',':');
h=line([0 Udr],[idr idr]);
set(h,'Color','g','LineStyle',':');
xlabel('Ud [V]')
ylabel('id [mA]')
text(0.5,1,'jg-Ud/R1')
function f=f53(Ud)
% uklad rownan dla przykladu 5.3 sprowadzony do jednego rownania
% z jedna niewiadoma, a rownanie przyrownane do zera
k=1;
jg=1;
R1=10;
id=k*Ud*(Ud*Ud/3-3*Ud/2+2);
f=Ud/R1+id-jg;
function f=u53(x)
% uklad rownan do przykladu 5.3
% parametr wejsciowy x jest wektorem dwuelementowym, ktorego wartosci
% przepisywane sa do zmiennych o nazwach z ukladu rownan
% funkcja zwraca wektor dwuelementowy - oba rownania przyrownane sa do zera
k=1;
jg=1;
R1=10;
Ud=x(1);
id=x(2);
f(1,1)=id-k*Ud*(Ud*Ud/3-3*Ud/2+2);
f(2,1)=Ud/R1+id-jg;
% Przyklad 5.4
% Rozwiazanie ukladu z przykladu 5.3
% za pomoca metody Newtona dla 2 rownan i 2 zmiennych
k=1;
jg=1;
R1=10;
dokladnosc=1e-12;
x=[5;0];
delta_x=1;
iter=0;
while delta_x>dokladnosc
iter=iter+1;
f=u53(x);
fprim=fprim53(x);
d_x=fprim\(-f);
x=x+d_x
delta_x(iter)=norm(u53(x));
end
figure(1)
hold off
semilogy(delta_x,'*:k')
title('Rozwiazanie dwuwymiarowa metoda Newtona')
xlabel('Numer iteracji')
ylabel('Blad rozwiazania')
grid on
function f=fprim53(x)
% Funkcja pochodnych czastkowych ukladu rownan 5.3
% parametr wejsciowy x jest wektorem dwuelementowym: [Ud id]
% funkcja zwraca macierz 2x2 zawierajaca pochodne czastkowe
k=1;
jg=1;
R1=10;
Ud=x(1);
id=x(2);
f(1,1)=-k*(Ud*Ud-3*Ud+2);
% pochodna rownania 1 po Ud
f(1,2)=1;
% pochodna rownania 1 po id
f(2,1)=1/R1;
% pochodna rownania 2 po Ud
f(2,2)=1;
% pochodna rownania 2 po id
% zadanie 5.2
clear all
close all
global R3
R3=0.1;
options=optimset('fsolve');
options=optimset(options,'MaxFunEvals',10000);
i=fsolve('uz52',[4,22,0.5],options);
i1=i(1);
id=i(2)-i(1);
fprintf('R3=%3.1fkOM id=%5.2f i1=%6.4f\n\n',R3,id,i1)
R3=0;
i=fsolve('uz52',[1,43,0.7],options);
i1=i(1);
id=i(2)-i(1);
fprintf('R3=%3.1fkOM id=%5.2f i1=%6.4f\n\n',R3,id,i1)
function u=uz52(p)
% uklad rownan do zadania 5.2
global R3
E=5;
%[V]
R1=0.1;
%[kOm]
R2=1;
is=1e-12;
%[mA];
Ut=0.025;
i1=p(1);
% przypisanie wektorowi zmiennych
i=p(2);
% kolejnych niewiadomych o nazwach zgodnych z rys.5.8
Ud=p(3);
id=is*(exp(Ud/Ut)-1);
u(1)=i-i1-id;
% i=i1+id;
u(2)=E-i*R1-i1*R2; % E=i*R1+i1*R2
u(3)=i1*R2-Ud-id*R3;% i1*R2=Ud+id*R3

Podobne dokumenty