Problem to solve nonlinear Eq. with Newton's Method
Mostrar comentarios más antiguos
Dear All,
I have problem with convergence using Newtons'method. I am trying to apply Newton's method in Matlab for my problem, and I wrote a code for my problem as following. The goal is to find three variables n, k and d. the expected valus are n=0.288; k=3.536; d=15.83 and the norm of function is 0.04529 and it shows the initial guess is good. But the convergence of calculated data for next itteratiobn is not suitable.
the results presented as below:
Iteration| n | k | d | Error |
0 | 0.20000| 3.50000 | 15.0 | 0.04529 |
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 8.811893e-18.
> In NEWTON_Nonlinear_nkd2003 (line 89)
1 |-126379826448.59407| -27665191566.24697 | -239395745423.6 | NaN |
Warning: Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN.
> In NEWTON_Nonlinear_nkd2003 (line 89)
2 | NaN| NaN | NaN | NaN |
Warning: Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN.
> In NEWTON_Nonlinear_nkd2003 (line 89)
I would appreciate it if anyone could help!
clc; clear; close all;
i=sqrt(-1);
n1=1;
n3=1.515;
lambda=632.8; %nm
alpha0=-deg2rad([50 55 60]);
teta1=deg2rad(50);
phi0 =deg2rad([75.357 68.897 61.947]);
iteration = 5;
syms n k d;
alpha=alpha0(1);
teta2=asin(n1/(n+i*k)*sin(teta1));
teta3=asin(n1/n3*sin(teta1));
beta=2*pi*d*(n+i*k)*cos(teta2)/lambda;
r12p=(n1*cos(teta2)-(n+i*k)*cos(teta1))/(n1*cos(teta2)+(n+i*k)*cos(teta1));
r23p=((n+i*k)*cos(teta3)-n3*cos(teta2))/((n+i*k)*cos(teta3)+n3*cos(teta2));
r12s=(n1*cos(teta1)-(n+i*k)*cos(teta2))/(n1*cos(teta1)+(n+i*k)*cos(teta2));
r23s=((n+i*k)*cos(teta2)-n3*cos(teta3))/((n+i*k)*cos(teta2)+n3*cos(teta3));
rp=(r12p+r23p*exp(2*i*beta))/(1+r12p*r23p*exp(2*i*beta));
rs=(r12s+r23s*exp(2*i*beta))/(1+r12s*r23s*exp(2*i*beta));
A=0.5*(abs(rp)^2*cos(alpha).^2-abs(rs)^2*sin(alpha).^2);
B=0.5*(rp*conj(rs)+rs*conj(rp))*2*sin(alpha).*cos(alpha);
phi1=atan(B./A)-phi0(1);
alpha=alpha0(2);
teta2=asin(n1/(n+i*k)*sin(teta1));
teta3=asin(n1/n3*sin(teta1));
beta=2*pi*d*(n+i*k)*cos(teta2)/lambda;
r12p=(n1*cos(teta2)-(n+i*k)*cos(teta1))/(n1*cos(teta2)+(n+i*k)*cos(teta1));
r23p=((n+i*k)*cos(teta3)-n3*cos(teta2))/((n+i*k)*cos(teta3)+n3*cos(teta2));
r12s=(n1*cos(teta1)-(n+i*k)*cos(teta2))/(n1*cos(teta1)+(n+i*k)*cos(teta2));
r23s=((n+i*k)*cos(teta2)-n3*cos(teta3))/((n+i*k)*cos(teta2)+n3*cos(teta3));
rp=(r12p+r23p*exp(2*i*beta))/(1+r12p*r23p*exp(2*i*beta));
rs=(r12s+r23s*exp(2*i*beta))/(1+r12s*r23s*exp(2*i*beta));
A=0.5*(abs(rp)^2*cos(alpha).^2-abs(rs)^2*sin(alpha).^2);
B=0.5*(rp*conj(rs)+rs*conj(rp))*2*sin(alpha).*cos(alpha);
phi2=atan(B./A)-phi0(2);
alpha=alpha0(3);
teta2=asin(n1/(n+i*k)*sin(teta1));
teta3=asin(n1/n3*sin(teta1));
beta=2*pi*d*(n+i*k)*cos(teta2)/lambda;
r12p=(n1*cos(teta2)-(n+i*k)*cos(teta1))/(n1*cos(teta2)+(n+i*k)*cos(teta1));
r23p=((n+i*k)*cos(teta3)-n3*cos(teta2))/((n+i*k)*cos(teta3)+n3*cos(teta2));
r12s=(n1*cos(teta1)-(n+i*k)*cos(teta2))/(n1*cos(teta1)+(n+i*k)*cos(teta2));
r23s=((n+i*k)*cos(teta2)-n3*cos(teta3))/((n+i*k)*cos(teta2)+n3*cos(teta3));
rp=(r12p+r23p*exp(2*i*beta))/(1+r12p*r23p*exp(2*i*beta));
rs=(r12s+r23s*exp(2*i*beta))/(1+r12s*r23s*exp(2*i*beta));
A=0.5*(abs(rp)^2*cos(alpha).^2-abs(rs)^2*sin(alpha).^2);
B=0.5*(rp*conj(rs)+rs*conj(rp))*2*sin(alpha).*cos(alpha);
phi3=atan(B./A)-phi0(3);
phi = [phi1 ; phi2 ; phi3];
PHI = matlabFunction(phi,'Vars',{n,k,d});
jacob_phi = [diff(phi1,n) diff(phi1,k) diff(phi1,d); diff(phi2,n) diff(phi2,k) diff(phi2,d); diff(phi3,n) diff(phi3,k) diff(phi3,d) ];
jacob_PHI = matlabFunction(jacob_phi,'Vars',{n,k,d});
error = 10^-5 ;
% Expected result n=0.288; k=3.536; d=15.83;
n0=0.2; k0=3.5; d0=15;
nkd = [n0 ;k0; d0] ;
PHI1 = feval(PHI, nkd(1), nkd(2),nkd(3));
i = 0;
fprintf(' Iteration| n | k | d | Error | \n')
norm1 = norm(PHI1);
fprintf('%10d |%10.5f| %10.5f | %10.1f | %10.5f |\n',i, n0, k0, d0, norm1)
while true
jacob_PHI1 = feval(jacob_PHI, nkd(1), nkd(2), nkd(3));
nkd = nkd - jacob_PHI1\PHI1;
PHI1 = feval(PHI, nkd(1), nkd(2), nkd(3));
i = i + 1 ;
norm1 = norm(PHI1);
fprintf('%10d |%10.5f| %10.5f | %10.1f | %10.5f |\n',i, nkd(1), nkd(2), nkd(3), norm1)
if norm(PHI1) < error || i == iteration
break
end
end
1 comentario
i = sqrt(-1);
n1 = 1;
n3 = 1.515;
lambda = 632.8;
alpha0 = -deg2rad([50 55 60]);
teta1 = deg2rad(50);
phi0 = deg2rad([75.357 68.897 61.947]);
% iteration = 5;
% syms n k d;
n = 0.288;
k = 3.536;
d = 15.83;
alpha = alpha0(1);
teta2 = asin(n1/(n+i*k)*sin(teta1));
teta3 = asin(n1/n3*sin(teta1));
beta = 2*pi*d*(n+i*k)*cos(teta2)/lambda;
r12p = (n1*cos(teta2)-(n+i*k)*cos(teta1))/(n1*cos(teta2)+(n+i*k)*cos(teta1));
r23p = ((n+i*k)*cos(teta3)-n3*cos(teta2))/((n+i*k)*cos(teta3)+n3*cos(teta2));
r12s = (n1*cos(teta1)-(n+i*k)*cos(teta2))/(n1*cos(teta1)+(n+i*k)*cos(teta2));
r23s = ((n+i*k)*cos(teta2)-n3*cos(teta3))/((n+i*k)*cos(teta2)+n3*cos(teta3));
rp = (r12p+r23p*exp(2*i*beta))/(1+r12p*r23p*exp(2*i*beta));
rs = (r12s+r23s*exp(2*i*beta))/(1+r12s*r23s*exp(2*i*beta));
A = 0.5*(abs(rp)^2*cos(alpha).^2-abs(rs)^2*sin(alpha).^2);
B = 0.5*(rp*conj(rs)+rs*conj(rp))*2*sin(alpha).*cos(alpha);
phi1 = atan(B./A)-phi0(1)
alpha = alpha0(2);
teta2 = asin(n1/(n+i*k)*sin(teta1));
teta3 = asin(n1/n3*sin(teta1));
beta = 2*pi*d*(n+i*k)*cos(teta2)/lambda;
r12p = (n1*cos(teta2)-(n+i*k)*cos(teta1))/(n1*cos(teta2)+(n+i*k)*cos(teta1));
r23p = ((n+i*k)*cos(teta3)-n3*cos(teta2))/((n+i*k)*cos(teta3)+n3*cos(teta2));
r12s = (n1*cos(teta1)-(n+i*k)*cos(teta2))/(n1*cos(teta1)+(n+i*k)*cos(teta2));
r23s = ((n+i*k)*cos(teta2)-n3*cos(teta3))/((n+i*k)*cos(teta2)+n3*cos(teta3));
rp = (r12p+r23p*exp(2*i*beta))/(1+r12p*r23p*exp(2*i*beta));
rs = (r12s+r23s*exp(2*i*beta))/(1+r12s*r23s*exp(2*i*beta));
A = 0.5*(abs(rp)^2*cos(alpha).^2-abs(rs)^2*sin(alpha).^2);
B = 0.5*(rp*conj(rs)+rs*conj(rp))*2*sin(alpha).*cos(alpha);
phi2 = atan(B./A)-phi0(2)
alpha = alpha0(3);
teta2 = asin(n1/(n+i*k)*sin(teta1));
teta3 = asin(n1/n3*sin(teta1));
beta = 2*pi*d*(n+i*k)*cos(teta2)/lambda;
r12p = (n1*cos(teta2)-(n+i*k)*cos(teta1))/(n1*cos(teta2)+(n+i*k)*cos(teta1));
r23p = ((n+i*k)*cos(teta3)-n3*cos(teta2))/((n+i*k)*cos(teta3)+n3*cos(teta2));
r12s = (n1*cos(teta1)-(n+i*k)*cos(teta2))/(n1*cos(teta1)+(n+i*k)*cos(teta2));
r23s = ((n+i*k)*cos(teta2)-n3*cos(teta3))/((n+i*k)*cos(teta2)+n3*cos(teta3));
rp = (r12p+r23p*exp(2*i*beta))/(1+r12p*r23p*exp(2*i*beta));
rs = (r12s+r23s*exp(2*i*beta))/(1+r12s*r23s*exp(2*i*beta));
A = 0.5*(abs(rp)^2*cos(alpha).^2-abs(rs)^2*sin(alpha).^2);
B = 0.5*(rp*conj(rs)+rs*conj(rp))*2*sin(alpha).*cos(alpha);
phi3 = atan(B./A)-phi0(3)
phi = [phi1; phi2; phi3];
norm(phi) % expected norm is 0.04529
Respuestas (1)
i=sqrt(-1);
n1=1;
n3=1.515;
lambda=632.8; %nm
alpha0=-deg2rad([50 55 60]);
teta1=deg2rad(50);
phi0 =deg2rad([75.357 68.897 61.947]);
iteration = 5;
syms n k d;
alpha=alpha0(1);
teta2=asin(n1/(n+i*k)*sin(teta1));
teta3=asin(n1/n3*sin(teta1));
beta=2*pi*d*(n+i*k)*cos(teta2)/lambda;
r12p=(n1*cos(teta2)-(n+i*k)*cos(teta1))/(n1*cos(teta2)+(n+i*k)*cos(teta1));
r23p=((n+i*k)*cos(teta3)-n3*cos(teta2))/((n+i*k)*cos(teta3)+n3*cos(teta2));
r12s=(n1*cos(teta1)-(n+i*k)*cos(teta2))/(n1*cos(teta1)+(n+i*k)*cos(teta2));
r23s=((n+i*k)*cos(teta2)-n3*cos(teta3))/((n+i*k)*cos(teta2)+n3*cos(teta3));
rp=(r12p+r23p*exp(2*i*beta))/(1+r12p*r23p*exp(2*i*beta));
rs=(r12s+r23s*exp(2*i*beta))/(1+r12s*r23s*exp(2*i*beta));
A=0.5*(abs(rp)^2*cos(alpha).^2-abs(rs)^2*sin(alpha).^2);
B=0.5*(rp*conj(rs)+rs*conj(rp))*2*sin(alpha).*cos(alpha);
phi1=atan(B./A)-phi0(1);
alpha=alpha0(2);
teta2=asin(n1/(n+i*k)*sin(teta1));
teta3=asin(n1/n3*sin(teta1));
beta=2*pi*d*(n+i*k)*cos(teta2)/lambda;
r12p=(n1*cos(teta2)-(n+i*k)*cos(teta1))/(n1*cos(teta2)+(n+i*k)*cos(teta1));
r23p=((n+i*k)*cos(teta3)-n3*cos(teta2))/((n+i*k)*cos(teta3)+n3*cos(teta2));
r12s=(n1*cos(teta1)-(n+i*k)*cos(teta2))/(n1*cos(teta1)+(n+i*k)*cos(teta2));
r23s=((n+i*k)*cos(teta2)-n3*cos(teta3))/((n+i*k)*cos(teta2)+n3*cos(teta3));
rp=(r12p+r23p*exp(2*i*beta))/(1+r12p*r23p*exp(2*i*beta));
rs=(r12s+r23s*exp(2*i*beta))/(1+r12s*r23s*exp(2*i*beta));
A=0.5*(abs(rp)^2*cos(alpha).^2-abs(rs)^2*sin(alpha).^2);
B=0.5*(rp*conj(rs)+rs*conj(rp))*2*sin(alpha).*cos(alpha);
phi2=atan(B./A)-phi0(2);
alpha=alpha0(3);
teta2=asin(n1/(n+i*k)*sin(teta1));
teta3=asin(n1/n3*sin(teta1));
beta=2*pi*d*(n+i*k)*cos(teta2)/lambda;
r12p=(n1*cos(teta2)-(n+i*k)*cos(teta1))/(n1*cos(teta2)+(n+i*k)*cos(teta1));
r23p=((n+i*k)*cos(teta3)-n3*cos(teta2))/((n+i*k)*cos(teta3)+n3*cos(teta2));
r12s=(n1*cos(teta1)-(n+i*k)*cos(teta2))/(n1*cos(teta1)+(n+i*k)*cos(teta2));
r23s=((n+i*k)*cos(teta2)-n3*cos(teta3))/((n+i*k)*cos(teta2)+n3*cos(teta3));
rp=(r12p+r23p*exp(2*i*beta))/(1+r12p*r23p*exp(2*i*beta));
rs=(r12s+r23s*exp(2*i*beta))/(1+r12s*r23s*exp(2*i*beta));
A=0.5*(abs(rp)^2*cos(alpha).^2-abs(rs)^2*sin(alpha).^2);
B=0.5*(rp*conj(rs)+rs*conj(rp))*2*sin(alpha).*cos(alpha);
phi3=atan(B./A)-phi0(3);
phi = [phi1 ; phi2 ; phi3];
PHI = matlabFunction(phi,'Vars',{n,k,d});
n0=0.2; k0=3.5; d0=15;
nkd0 = [n0 ;k0; d0] ;
nkd = fsolve(@(x)PHI(x(1),x(2),x(3)),nkd0,optimset('TolFun',1e-8,'TolX',1e-8))
norm(PHI(nkd(1),nkd(2),nkd(3)))
Categorías
Más información sobre Mathematics and Optimization en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!