Runge-Kutta method, cannot produce the correct graphs

조회 수: 4 (최근 30일)
Ben Bawtree
Ben Bawtree 2021년 3월 11일
편집: Ben Bawtree 2021년 3월 12일
The code should output, three graphs evaluating the 2nd order Runge-Kutta method for varying step size. However, currently the output is a graph with three horizontal lines, that should be curving upwards and tending towards the actual solution. I am confused as to what i have done wrong, any advice would be great.

채택된 답변

James Tursa
James Tursa 2021년 3월 11일
편집: James Tursa 2021년 3월 11일
You need to index x in your calculations. E.g.,
q1 = f(x(i),y(i));
q2 = f(x(i)+h, y(i)+h*q1);
You should initialize y(1), not y(2):
y(1) = 1;
And I would set up your indexing and for-loop this way:
x = (2:h:4);
no_points = numel(x);
for i = 1:no_points-1
And plot the entire x and y vectors
plot(x,y,'o-')
  댓글 수: 3
James Tursa
James Tursa 2021년 3월 11일
편집: James Tursa 2021년 3월 11일
You are misunderstanding the meaning of "y(2) = 1" in your instructions. That simply means that when x=2 the corresponding value of y is 1. It does not mean that the index value used for your y vector in your code has to be 2. The index values you use are different from the actual x and y values. In the code I have suggested you have this setup
x(1) = 2
y(1) = 1
That is, when the initial value of x is 2, the corresponding initial value of y is 1. That is what you want. The (1) indexing is just that ... only indexing. It is not the values. Bottom line is that the y(1) = 1 statement is correct and matches your instructions because it is paired with the x(1)=2 value.
Ben Bawtree
Ben Bawtree 2021년 3월 11일
ah thank you! i appreciate you explaining, cheers

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

William Rose
William Rose 2021년 3월 11일
See attached code. You assigned a value to y(2) initially:
y(2)=1;
This creates a vector of length 2, where y(1)=0 by default, and y(2)=1. This is kind of strange because i t means y(2) goes with x(1), etc. So I changed that by asisgning a value to y(1):
y(1)=1;
Then I plotted the x vector versus the y vector after doing the 2nd order RK integration. I changed the outer loop variable from h=[.5 .2 .1] to j=1:3. This allowed me to have a value j that I could use to specify which third of the figure to use for each plot. As a result, I had to define h as a 3 element vector before entering the outer loop. Then, inside the loop, I refer to h(j) wherever I need the value of h.
See code and see plot of results.
%BenBawtreeCode.m WCRose 20210311
clear all; close all; clc;
f = @(x,y) 5*y-3;
%next line creates a vector of length 2 and assigns a value to the second element
%y(2) = 1;
%I think you actualy want to assign a value to first element of y
y(1)=1;
h=[.5 .2 .1];
figure;
for j = 1:3
% define the number of points to be evaluated;
no_points = 2/h(j)+1;
x = (2:h(j):4);
% for i = 2:no_points
for i = 1:no_points-1
% RK2 method
q1 = f(x,y(i));
q2 = f(x+h(j), y(i)+h(j)*q1);
y(i+1) = y(i) + h(j)*0.5*(q1+q2);
end
disp(['h = ',num2str(h(j)), ', y(4)=', num2str(y(i+1))]);
subplot(3,1,j); %plot in a specific sub-third of the figure
plot(x,y,'ro-'); %plot all the x values versus all the y values
grid on;
ylabel('Y');
titlestr=sprintf('h=%.1f',h(j));
title(titlestr); %plot titleh
if j==3, xlabel('X'); end %X axis label on bottom plot
end
  댓글 수: 1
William Rose
William Rose 2021년 3월 11일
Notice that your function
f(x,y)=5*y-3
defines the derivative. Therefore the diffential equation you are solving is
dy/dx = 5y-3.
This is easily solved with standard calculus. The solution is
y(x) = K*exp(5*x)+0.6.
The unknown constant K is determined by applying your knowledge of th initial conditions. IN this case, we know from the code that y=1 when x=2. We use this informaiton to solve for K:
K=0.4/exp(10).
You can add the analytic solution to your plot. You will see that when h gets small (h<=.001), the RK2 solution approaches the analytic solution, which, to repeat, is
y(x) = K*exp(5*x)+0.6.

댓글을 달려면 로그인하십시오.


William Rose
William Rose 2021년 3월 11일
편집: William Rose 2021년 3월 11일
This code plots the solutions with different values of h on a single plot, and it adds the analytic solution.
%BenBawtreeCode.m WCRose 20210311
clear;
f = @(x,y) 5*y-3; %dy/dx
%Analytic solution to dy/dx=5y-3 is K*exp(5x)+0.6.
%Since y=1 at x=2, it must be that K=0.4/exp(10).
y(1)=1;
h=[.5 .2 .1 1e-3];
K=0.4/exp(10);
figure;
hold on;
plotstylestr=["ro-","go-","bo-","mo-","k.-"]; %We will use this below
for j = 1:length(h)
x = (2:h(j):4);
for i = 1:length(x)-1
% RK2 method
q1 = f(x,y(i));
q2 = f(x+h(j), y(i)+h(j)*q1);
y(i+1) = y(i) + h(j)*0.5*(q1+q2);
end
disp(['h = ',num2str(h(j)), ', y(x=4)=', num2str(y(i+1))]);
plot(x,y,plotstylestr(j)); %plot all the x values versus all the y values
end
plot(x,K*exp(5*x)+.6,plotstylestr(end));
grid on;
ylabel('Y'); xlabel('X'); %labels on axes
%Make sure next line matches values in h().
legend('h=0.5','h=0.2','h=0.1','h=0.001','Analytic');
Plot generated by code above:
  댓글 수: 1
Ben Bawtree
Ben Bawtree 2021년 3월 11일
Thank you for your answer! Very helpful, will have a look over my code

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Digital Filter Analysis에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by