📄 newtn.f
字号:
! newtn - Program to solve a system of nonlinear equations! using Newton's method. Equations defined by function fnewt. program newtn integer*4 MAXnVars, MAXnParams, MAXnStep parameter( MAXnVars = 20, MAXnParams = 20, MAXnStep = 100 ) integer*4 iStep, nStep, nVars, nParams, i, j real*8 temp real*8 x(MAXnVars), xp(MAXnVars,MAXnStep+1), a(MAXnParams) real*8 f(MAXnVars), D(MAXnVars,MAXnVars), dx(MAXnVars) real*8 ge, determ !* Set initial guess and parameters nStep = 10 ! Number of iterations before stopping nVars = 3 ! Number of variables nParams = 3 ! Number of parameters write(*,*) 'Enter the initial guess: ' do i=1,nVars write(*,*) ' x(', i, ') = ' read(*,*) x(i) xp(i,1) = x(i) ! Record initial guess for plotting enddo write(*,*) 'Enter the parameters: ' do i=1,nParams write(*,*) 'a(', i, ') = ' read(*,*) a(i) enddo !* Loop over desired number of steps do iStep=1,nStep !* Evaluate function f and its Jacobian matrix D call fnewt(x,a,MAXnVars,f,D) ! fnewt returns value of f and D do i=1,nVars do j=i+1,nVars temp = D(i,j) D(i,j) = D(j,i) ! Transpose of matrix D D(j,i) = temp enddo enddo !* Find dx by Gaussian elimination determ = ge(D,f,nVars,MAXnVars,dx) ! Determinant returned but not used !* Update the estimate for the root do i=1,nVars x(i) = x(i) - dx(i) ! Newton iteration for new x xp(i,iStep+1) = x(i) ! Save current estimate for plotting enddo enddo !* Print the final estimate for the root write(*,*) 'After ', nStep, ' iterations the root is:' do i=1,nVars write(*,*) 'x(', i, ') = ', x(i) enddo !* Print out the plotting variable: xp open(11,file='xp.txt',status='unknown') do i=1,nVars do j=1,nStep write(11,1001) xp(i,j) enddo write(11,*) xp(i,nStep+1) enddo1001 format(e12.6,', ',$) ! The $ suppresses the carriage return stop end!***** To plot in MATLAB; use the script below ********************!load xp.txt;!%* Plot the iterations from initial guess to final estimate!figure(1); clf; % Clear figure 1 window and bring forward!subplot(1,2,1) % Left plot! plot3(xp(1,:),xp(2,:),xp(3,:),'o-');! xlabel('x'); ylabel('y'); zlabel('z');! view([-37.5, 30]); % Viewing angle! grid; drawnow;!subplot(1,2,2) % Right plot! plot3(xp(1,:),xp(2,:),xp(3,:),'o-');! xlabel('x'); ylabel('y'); zlabel('z');! view([-127.5, 30]); % Viewing angle! grid; drawnow;!% Plot data from lorenz (if available).!flag = input('Plot data from lorenz program? (1=Yes/0=No): ');!if( flag == 1 )! figure(2); clf; % Clear figure 1 window and bring forward! load xplot.txt; load yplot.txt; load zplot.txt;! plot3(xplot,yplot,zplot,'-',xp(1,:),xp(2,:),xp(3,:),'o--');! xlabel('x'); ylabel('y'); zlabel('z');! view([40 10]); % Rotate to get a better view! grid; % Add a grid to aid perspective!end!******************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -