Function may not have a root

2 次查看(过去 30 天)
I am getting this eror with this code and associated functions:
Exiting fzero: aborting search for an interval containing a sign change
because no sign change is detected during search.
Function may not have a root.
Here is the code and functions:
close all
clear all
clc
% %FOR A = 3
%
x_til = linspace(0,1,10);
dt = 0.1;
tmax = 1;
t_til = linspace(dt,tmax,10);
nt = length(t_til);
nx = length(x_til);
x0 = [0.0000001 1];
tp1 = ones(nt);
tp2 = zeros(nt);
for A = 3 %finding tp actual
for jx = 1:nx
Tfun1 = @(tp) fX10B1T0(x_til(jx),tp);
Tfun1A = @(tp) (1*(10^(-A))) - Tfun1(tp);
tp1(jx) = fzero(Tfun1A,x0(1));
end
for jx = 1:nx
Tfun2 = @(tp) fX11B10T0(x_til(jx),tp,A);
Tfun2A = @(tp) (1*(10^(-A))) - Tfun2(tp);
tp2(jx) = fzero(Tfun2A,x0(1));
end
end
Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root. Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root. Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root. Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root. Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root. Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root. Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root. Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root. Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root. Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root.
Exiting fzero: aborting search for an interval containing a sign change because no sign change is detected during search. Function may not have a root.
for ix = 1:nx
for it = 1:nt
TX10B1T0 = fX10B1T0(x_til,t_til);
end
plot (x_til, TX10B1T0(ix,:));
end
function [T_til1] = fX10B1T0 (x_til, t_til)
lengthx=length(x_til);
lengtht=length(t_til);
T_til1=zeros(lengthx,lengtht); % Preallocating Arrays for speed
xd = zeros(lengthx);
td = zeros(lengtht);
for ix=1:lengthx % Begin time loop
xd_ix=xd(ix); % Set current time
for it=1:lengtht % Begin space loop
td_it=td(it); % Set current space
if td_it == 0 % For time t=0 condition
T_til1(it,ix)=0; % Set inital temperature
else
% Solution at any time
T_til1(ix,it)=erfc(xd_ix/sqrt(4*td_it));
end % if td_it
end % for ix
end % for it
end % function
function [T_til2] = fX11B10T0 (t_til, x_til,A)
lengthx=length(x_til);
lengtht=length(t_til);
T_til2=zeros(lengtht,lengthx); % Preallocating Arrays for speed
for it=1:lengtht % Begin time loop
td_it=t_til(it); % Set current time
for ix=1:lengthx % Begin space loop
xd_ix=x_til(ix); % Set current space
td_dev1=(1/(10*A))*(2-xd_ix)^2; % First deviation time
td_dev2=(1/(10*A))*(2+xd_ix)^2; % Second deviation time
if td_it == 0 % For time t=0 condition
T_til2(it,ix)=0; % Set inital temperature
elseif td_it <= td_dev1 % Solution for first small times:
T_til2(it,ix)=erfc(xd_ix/sqrt(4*td_it));
elseif td_it > td_dev1 && td_it <= td_dev2 % Solution for second small times:
T_til2(it,ix)=erfc(xd_ix/sqrt(4*td_it))-erfc((2-xd_ix)/sqrt(4*td_it));
else
m_max=ceil(sqrt(A*log(10)/(td_it*pi^2))); % Set max. No. terms
% Start X11B10T0 case for large times:
T_til2(it,ix)=1-xd_ix; % steady-state temperature solution
for m=1:m_max % Continue X11B10T0 case for large times
% Series solutions:
betam=m*pi; % Define eigenvalues
T_til2(it,ix)=T_til2(it,ix)-2*exp(-betam^2*td_it)*sin(betam*xd_ix)/betam;
end % for m
end % if td_it
if xd_ix == 1 % For location x=1 condition
T_til2(it,ix)=0; % Set x=1 boundary temperature
end % if xd_ix
end % for ix
end % for it
end % function

采纳的回答

Walter Roberson
Walter Roberson 2023-11-20
td = zeros(lengtht);
You initialize td to all zeros
for ix=1:lengthx % Begin time loop
xd_ix=xd(ix); % Set current time
for it=1:lengtht % Begin space loop
td_it=td(it); % Set current space
You extract a value from td. But td is all zero. And you never change td anywhere in the function after you initialize it to zero.
if td_it == 0 % For time t=0 condition
T_til1(it,ix)=0; % Set inital temperature
But it does indeed equal 0 because td remains 0. So you are always setting all of T_til1 to 0.
Your fX10B1T0 function returns constant values. There is no possibility of finding a sign change in a function that is constant.
  2 个评论
Matthew Palermo
Matthew Palermo 2023-11-20
I pulled the two functions from the textbook and copied them as they are presented. My understanding of how fX10B1T0 is supposed to run is that
if td_it == 0 % For time t=0 condition
T_til1(it,ix)=0; % Set inital temperature
is supposed to be set to 0 since I am working with non-dimensional figures here.
Could the issue be in the script that I wrote?
Walter Roberson
Walter Roberson 2023-11-20
In your code, your time is always zero. You set td = zeros(lengtht) and you never change it. So the td_it == 0 is always true, and none of the elseif/else are executed.
You do get
if xd_ix == 1 % For location x=1 condition
T_til2(it,ix)=0; % Set x=1 boundary temperature
end % if xd_ix
executed in some meaningful way... but since at time 0 T_til2 entries are set to 0, setting one or more entries to 0 at this point makes no difference to the outcome.
Therefore, no matter what your inputs are, your T_til2 array is going to be all 0. And a function that is all zero does not have a zero crossing.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品


版本

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by