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