Fortran What's causing my Fortran bisection method to give incorrect results?

AI Thread Summary
The discussion revolves around troubleshooting a Fortran program designed to solve a transcendental equation for temperature in thermodynamics. The user encounters an issue where the program consistently reports "There's an even number of root(s) in that interval," despite calculations indicating otherwise. The problem stems from the function f(x) not correctly utilizing the temperature variables t_1 and t_2, leading to incorrect evaluations that resulted in infinite values for fa and fb. Suggestions from other users highlight the need to pass t_1 and t_2 as arguments to the function f to ensure proper calculations. After implementing this change, the user resolves the initial issue but encounters a new problem where the solution appears as a very small number close to zero. Ultimately, the user corrects a minor error in the output line of the program, successfully obtaining the correct solution.
fluidistic
Gold Member
Messages
3,928
Reaction score
272
I'm rusty with fortran and programming in general. I can't see my "error" in a code that I wrote from scratch.
Basically I wanted to get some fun and solve for a temperature in thermodynamics where I must get "T_f" which appear in a transcendental equation: ##A\ln \left ( \frac{T_f^2}{T_1T_2} \right )+2B[2T_f-(T_1T_2)]=0##.
Where T_1 is worth 100, T_2 is worth 200, A=2 and B=0.005.
Here is my code:
Code:
program rootfinderbisection
implicit none

real(4)::a,b,xn,fa,fb,fn,f,e,x_n,t_1,t_2


write(*,*)"Enter the temperatures t_1 and t_2"
read(*,*)t_1, t_2
write(*,*)"Enter your interval guess, [a,b]"
read(*,*)a,b
write(*,*)"Enter the precision you want"
read(*,*)e
fa=f(a)
fb=f(b)

if (abs(fa)<e) then
write(*,*) "The solution is",a
stop
else if (abs(fb)<e) then
write(*,*)"The solution is",b
stop
end if

if (f(a)*f(b)>0) then
write(*,*)"There's an even number of root(s) in that interval"
stop
endif

xn=0.5*(a+b)
fn=f(xn)

do while (abs(fn)>e) 
if (fa*fn<0) then
b=xn
fb=fn
else
a=xn
fa=fn
endif

xn=0.5*(a+b)
fn=f(xn)
end do
write(*,*)"The solution is",x_n


end program
that I compile along with
Code:
function f(x)
implicit none

real(4)::f,x, t_1,t_2
f=2.*log((x**2.)/(t_1*t_2))+2.*0.005*(2.*x-(t_1+t_2))

end function
The problem is that for the values I said above, I get the message "There's an even number of root(s) in that interval". Thus apparently the condition f(a)*f(b)>0 is satisfied. However when I enter the numbers in my pocket calculator I get f(a)=-2.3862... and f(b)=2.3862... where I truncated both values. Thus the condition is not satisfied.
I really don't see what's wrong. Any idea?

Edit: I tried with many different values for a and b. I even changed t_1 and t_2, same message.

Edit2: I've just tested the values of fa and fb. It thinks they are worth infinity. Going to check this out.
Edit3: No idea why it thinks they are worth infinity. o_0.
Edit4: ok it does not plug in t_1 and t_2 inside my function.
 
Last edited:
Technology news on Phys.org
Try including t_1 and t_2 as arguments in the function f and see if this resolves the calculation errors.
 
Your function "f(x)" does not agree with your formula at the top of your post. Is the last term in the bracket term of your equation "T_1 * T_2" or "T_1 + T_2".
 
fluidistic said:
Edit4: ok it does not plug in t_1 and t_2 inside my function.

t_1 and t_2 in the function are completely separate variables from t_1 and t_2 in the main program. If you want t_1 and t_2 in the function to have the same values as in main, you need to make them arguments to the function along with x.
 
Thanks all for the tips. To TheoMcCloskey, you're right, I made a latex typo here for T_f. The one in my program is ok.
So it got rid of the problem! However I now get "The solution is 3.02481484E-39" which is basically 0. I'll investigate and post if stuck.

Edit: Worked, problem solved. I had to change the line "write(*,*)"The solution is",x_n" to "write(*,*)"The solution is",xn".
Thanks a lot guys!
 
Last edited:
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.
Thread 'Project Documentation'
Trying to package up a small bank account manager project that I have been tempering on for a while. One that is certainly worth something to me. Although I have created methods to whip up quick documents with all fields and properties. I would like something better to reference in order to express the mechanical functions. It is unclear to me about any standardized format for code documentation that exists. I have tried object orientated diagrams with shapes to try and express the...

Similar threads

Replies
8
Views
2K
Replies
1
Views
2K
Replies
11
Views
2K
Replies
12
Views
2K
Replies
6
Views
3K
Replies
13
Views
3K
Replies
11
Views
2K
Replies
17
Views
23K
Replies
19
Views
2K
Back
Top