Trapezodial Method using while loop
显示 更早的评论
Hi for my numerics class i have an assignment, which is supposed to be quite easy but I can't seem to find my mistake. We have to solve the integral of sin(x) within 0 and pi using the trapezodial method and double the interval until the solution is close enough to the true value 2. So far my code looks like this, and i'm not supposed to use trapz.
clear
f=@(x) sin(x);
a=0;
b=pi;
n=1;
h=(b-a)/n;
tol=10^-6;
I=h*s
s=0.5*(f(a)+f(b))
i=0
while abs(2-I)>=tol
n=n*2;
a=b-(b/n);
b=b/n;
h(n)=((b*(n-1)/n)-(a/n))/n;
s(n)=0.5*(f(a)+f(b));
I=sum(h(n)*s(n));
i=i+1;
end
I
but it takes a really long time and gives me the following error:
Requested 1073741824x1 (8.0GB) array exceeds maximum
array size preference. Creation of arrays greater
than this limit may take a long time and cause MATLAB
to become unresponsive. See array size limit or
preference panel for more information.
Error in NumMeth3 (line 18)
h(n)=((b*(n-1)/n)-(a/n))/n;
I don't know why this gets so 'big'. I've tried a lot but nothing seems to work, so I'd love some help!
Thanks in advance.
5 个评论
Rik
2020-5-18
If you had put a breakpoint on one of the first line to step through your code line by line, you would have noticed that h and s are arrays that are growing in size every iteration. It doesn't seem necessary to save them as array, although removing the (n) will probably not solve the underlying problem.
I think you have to take a look again at the algorithm and try to put the steps in words first. Then paste it into Matlab as comments. Only after that start writing the code. That way we can more easily see where your code deviates from your intentions.
LauraB
2020-5-18
Rik
2020-5-18
You annotated your code, which is good, but the wrong way around. You should write the comments first, and then the code.
You need to split the curve into trapezoids. How can you divide the range of 0 to pi into sections? How would you create the arrays with the corners of the trapezoids? How would you calculate the area of each trapezoid separately?
LauraB
2020-5-18
Rik
2020-5-18
One hint that should help dividing the range 0 to pi in segments:
linspace(0,pi,n)
回答(1 个)
David Hill
2020-5-18
f=@(x) sin(x);
tol=1e-6;
x=linspace(0,pi,2);
A=sum(movsum(f(x),2,'Endpoints','discard')/2.*diff(x));
n=2;
while abs(2-A)>=tol
x=linspace(0,pi,n+1);
A=sum(movsum(f(x),2,'Endpoints','discard')/2.*diff(x));
n=2*n;
end
类别
在 帮助中心 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!