help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Bracketing Issues with fzero


From: Fabio Somenzi
Subject: Bracketing Issues with fzero
Date: Fri, 26 Mar 2010 10:33:21 -0600

Hi,

I just installed the stand-alone version of Octave 3.2.4 on my netbook
running Windows 7 Enterprise.

The script below, with fsolve instead of fzero, runs fine on Octave
3.0.3 which I have installed on other machines.  With 3.2.4, fsolve
returns -3 in many calls.  After consulting the documentation, I
switched to fzero, but I get messages like

fzero: zero point is not bracketed
fzero: not a valid initial bracketing

I thought I had a work-around when I realized that the first message
(zero point is not bracketed) occurred when the guess for the solution
was in fact the solution.  (This happens every time at the first
iteration of the inner loop).  So, I thought I could just slightly
perturb the initial value or skip the first (needless) iteration of
the inner loop, but I only end up getting the second message (not a
valid initial bracketing) later on.

How should I proceed?  This is my first post.  Feel free to advise on
how to report problems effectively.

Thanks

Fabio

-------------------------------------------------------------------------------------------------------------
## Model for a falling climber in which we assume friction at the top
## biner.  This is a simplified model based on conservation of energy.
## This model uses the length of unstretched rope that slips through the
## carabiner as basic variable.

## The fall distance is assumed to be twice the length of rope initially
## on the climber's side of the carabiner.

global m = 80;          # kg    : mass (80)
global g = 9.81;        # m/s^2 : acceleration due to gravity
global k = 20000;       # N     : rope modulus
global mu;              #       : 1 - pulley efficiency of the carabiner
global L1;              # m     : length of rope on the climber's side
global L2;              # m     : length of rope on the belayer's side

## Estimate impact force according to Wexler's equation.
function iforce = impactf(ff)

  global m g k;

  w = m * g;
  iforce = w * (1 + sqrt(1 + 2 * k * ff / w));
endfunction

## Energy balance equation.  For given slippage s, it returns the energy
## imbalance.  We seek the value of s that makes that imbalance zero.
function w = f(s)

  global m g k mu;
  global L1 L2;

  z = L2 - s;
  q = 1 - mu;

  w = k/(2*q^2) * (mu*(2-mu)*s + (L1 + L2*q))*(s/z)^2 - \
      m*g*(2*L1 + (L1+s)*s/(q*z) + s);

endfunction

## Setup.
muvals = [0, 0.25, 0.5, 0.75, 0.999]; # values of mu to be considered
L1 = 2; # To vary the fall factor, we keep L1 fixed and change L2
n = 400; # Number of samples of fall factor
ff = linspace(0.00001,1.99999,n);

## Computation of one curve for each value of mu.
for i = 1:n
  L2 = (2/ff(i) - 1) * L1;
  rope(i) = L1+L2; # length of rope required by the given fall factor
  ## To avoid numerical problems, we need a reasonable initial value. We
  ## use the analytical solution to derive one for mu = 0 and then we
  ## use the solution for one value of mu as initial value of s for the
  ## next value of mu.  This works best if the values of mu are
  ## considered in increasing order.
  nof(i) = impactf(ff(i));  # Rope tension according to Wexler's equation
  guess = L2 * nof(i) / (nof(i)+k); # corresponding slip
  for j = 1:length(muvals)
    mu = muvals(j);
    [s,value,info,myoutput] = fzero(@f, guess);
    if (info != 1)
      if (info < -4 || info > 1)
        printf("fzero returned %d\n", info);
      else
        perror("fzero", info);
      endif
    endif
    guess = s;
    slip(i,j) = s/L2; # slippage
    T2(i,j) = k * s / (L2-s); # force on belay
    T1(i,j) = T2(i,j) / (1-mu); # force on climber
    T(i,j) = T1(i,j) + T2(i,j); # force at the anchor
    stretch(i,j) = ((L1+s)*s/((1-mu)*(L2-s)) + s)/(L1+L2); # total stretch
  endfor
endfor

## Plotting of curves.
plot(ff, T, "linewidth", 2);
for j = 1:length(muvals)
  strmat{j} = strcat("mu = ", num2str(muvals(j)));
endfor
legend(strmat, "location", "northwest");
#print('topAnchor.eps', '-depsc');


reply via email to

[Prev in Thread] Current Thread [Next in Thread]