Find a variable from an integration equation

Hi,
I want to calculate motor_power variable from know total_time variable.
All other parameters are known expect motor_power.
I have tried fsolve and fzero functions but throwing errors related to integration
Kindly request you to support for my problem
The code is as below:
ct=@(speed)base_speed1./(motor_power-(a+b.*speed.^2).*base_speed); %Function 1%
cp=@(speed)speed./(motor_power-(a+b.*speed.^2).*speed); %Function 2%
total_time=m_veh*integral(ct,0,base_speed)+m_veh*integral(cp,base_speed,max_speed); %Integration equation%

3 Comments

Your posted code does not contain fsolve or fzero or the error messages they threw.
"I have tried fsolve and fzero functions but throwing errors related to integration"
You have to show what you tried with those functions and what errors did you get. Copy and paste the rest of the code and the error messages you get i.e. all of the red text.
Error using tt>@(speed)b./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*b_speed)
Too many input arguments.
Error in tt>@(speed)ct(speed,motor_power) (line 39)
fun = @(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m));
Error in integralCalc/iterateScalarValued (line 314)
fx = FUN(t);
Error in integralCalc/vadapt (line 132)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);
Error in integralCalc (line 75)
[q,errbnd] = vadapt(@AtoBInvTransform,interval);
Error in integral (line 87)
Q = integralCalc(fun,a,b,opstruct);
Error in tt>@(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m)) (line 39)
fun = @(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m));
Error in fsolve (line 264)
fuser = feval(funfcn{3},x,varargin{:});
Error in tt (line 41)
motor_power = fsolve(fun,motor_power0);
Caused by:
Failure in initial objective function evaluation. FSOLVE cannot continue.
>>

Sign in to comment.

 Accepted Answer

ct=@(speed,motor_power)base_speed1./(motor_power-(a+b.*speed.^2).*base_speed); %Function 1%
cp=@(speed,motor_power)speed./(motor_power-(a+b.*speed.^2).*speed); %Function 2%
fun = @(motor_power)total_time-(m_veh*integral(@(speed)ct(speed,motor_power),0,base_speed)+m_veh*integral(@(speed)cp(speed,motorpower),base_speed,max_speed));
motor_power0 = 10; % initial guess
motor_power = fsolve(fun,motor_power0)

9 Comments

Hi I have updated my code as per your suggtion still it is throwing the errors
My full code is as below:
clear all
clc
motor_power=239000;
r=0.344;
s=1;
original_base_speed=20.3;
b=original_base_speed/s;
m=27.77;
m_v=1700*1.12;
g=9.81;
m_1=0.006;
m_2=0.0001;
r=1.204;
c_d=0.23;
height=1.59;
width=1.627;
area= 2.22;
total_time=5.68;
if b<=m
b_speed=b;
else
b_speed=m;
end
ct=@(speed)b./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*b_speed);
if m>b
cp=@(speed)speed./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*speed);
else
cp=0;
end
fun = @(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m));
motor_power0 = 10; % initial guess
motor_power = fsolve(fun,motor_power0);
Error using solution>@(speed)b./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*b_speed)
Too many input arguments.

Error in solution>@(speed)ct(speed,motor_power) (line 31)
fun = @(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m));

Error in integralCalc/iterateScalarValued (line 314)
fx = FUN(t);

Error in integralCalc/vadapt (line 132)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

Error in integralCalc (line 75)
[q,errbnd] = vadapt(@AtoBInvTransform,interval);

Error in integral (line 87)
Q = integralCalc(fun,a,b,opstruct);

Error in solution>@(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m)) (line 31)
fun = @(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m));

Error in fsolve (line 267)
fuser = feval(funfcn{3},x,varargin{:});

Caused by:
Failure in initial objective function evaluation. FSOLVE cannot continue.
Errors :
Error using tt>@(speed)b./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*b_speed)
Too many input arguments.
Error in tt>@(speed)ct(speed,motor_power) (line 39)
fun = @(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m));
Error in integralCalc/iterateScalarValued (line 314)
fx = FUN(t);
Error in integralCalc/vadapt (line 132)
[q,errbnd] = iterateScalarValued(u,tinterval,pathlen);
Error in integralCalc (line 75)
[q,errbnd] = vadapt(@AtoBInvTransform,interval);
Error in integral (line 87)
Q = integralCalc(fun,a,b,opstruct);
Error in tt>@(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m)) (line 39)
fun = @(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m));
Error in fsolve (line 264)
fuser = feval(funfcn{3},x,varargin{:});
Error in tt (line 41)
motor_power = fsolve(fun,motor_power0);
Caused by:
Failure in initial objective function evaluation. FSOLVE cannot continue.
>>
clear all
clc
I thoguht motor_power is unknown and the problem is to find its value?
% motor_power=239000; to be solved?
r=0.344;
s=1;
original_base_speed=20.3;
b=original_base_speed/s;
m=27.77;
m_v=1700*1.12;
g=9.81;
m_1=0.006;
m_2=0.0001;
r=1.204;
c_d=0.23;
height=1.59;
width=1.627;
area= 2.22;
total_time=5.68;
if b<=m
b_speed=b;
else
b_speed=m;
end
ct=@(speed)b./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*b_speed);
if m>b
cp=@(speed)speed./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*speed);
else
cp=0;
end
ct
ct = function_handle with value:
@(speed)b./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*b_speed)
cp
cp = function_handle with value:
@(speed)speed./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*speed)
ct and cp are both functions of one variable, speed. However, in the defintion of fun they are both called with two input arguments, speed and motor_power.
Perhaps ct and cp should be defined with motor_power as a second argument?
fun = @(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m))
fun = function_handle with value:
@(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m))
r=0.344;
s=1;
original_base_speed=20.3;
b=original_base_speed/s;
m=27.77;
m_v=1700*1.12;
g=9.81;
m_1=0.006;
m_2=0.0001;
r=1.204;
c_d=0.23;
height=1.59;
width=1.627;
area= 2.22;
total_time=5.68;
if b<=m
b_speed=b;
else
b_speed=m;
end
ct=@(speed,motor_power)b./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*b_speed);
if m>b
cp=@(speed,motor_power)speed./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*speed);
else
cp=@(speed,motor_power)zeros(size(speed));
end
fun = @(motor_power)total_time-(m_v*integral(@(speed)ct(speed,motor_power),0,b_speed)+m_v*integral(@(speed)cp(speed,motor_power),b_speed,m));
motor_power0 = 2e5; % initial guess
motor_power = fsolve(fun,motor_power0,optimset('MaxFunEvals',10000,'MaxIter',10000))
Equation solved. fsolve completed because the vector of function values is near zero as measured by the value of the function tolerance, and the problem appears regular as measured by the gradient.
motor_power = 2.0254e+05
% Plot control
motor_power = 100000:100:400000;
plot(motor_power,arrayfun(@(motor_power)fun(motor_power),motor_power))
Harsh
Harsh on 2 Sep 2023
Edited: Harsh on 2 Sep 2023
Yes, I want to find its value
If I take motor_power=239000 then it is giving same time.
Is there any other way to solve it?
the equation behind it is as below where p is the motor power and R is the resistance which depends on the velocity V
It's solved. Didn't you see the output from "fsolve" : 202 540 ?
Now its working.
Thank you very much for the quick support!
Q = @(v) sym(v);
r = Q(344)/Q(1000);
s = Q(1);
original_base_speed = Q(203)/Q(10);
b = original_base_speed/s;
m = Q(2777)/Q(100);
m_v = Q(1700)*Q(112)/Q(100);
g = Q(981)/Q(100);
m_1 = Q(0.006);
m_2 = Q(0.0001);
r = Q(1204)/Q(1000);
c_d = Q(23)/Q(100);
height = Q(159)/Q(100);
width = Q(1627)/Q(1000);
area = Q(222)/Q(100);
total_time = Q(568)/Q(100);
if b<=m
b_speed=b;
else
b_speed=m;
end
syms speed motor_power
ct(speed,motor_power) = b./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*b_speed);
if m>b
cp(speed,motor_power) = speed./(motor_power-(m_v*g.*(m_1+m_2.*speed)+0.5*r*c_d*area.*speed.^2).*speed);
else
cp(speed,motor_power) = zeros(size(speed));
end
fun(motor_power) = total_time-(m_v*int(ct(speed,motor_power),speed,0,b_speed)+m_v*int(cp(speed,motor_power),speed,b_speed,m))
fun(motor_power) = 
limit(fun(motor_power), motor_power, -inf)
ans = 
df = diff(fun(motor_power));
limit(df, motor_power, -inf)
ans = 
0
The lower limit is positive, and the derivative is positive out to negative infinity... so the function has no zero.
Possible exception would be in the range that is covered by the piecewise, but the function is everywhere positive in that range too.

Sign in to comment.

More Answers (0)

Categories

Products

Release

R2022a

Asked:

on 1 Sep 2023

Commented:

on 2 Sep 2023

Community Treasure Hunt

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

Start Hunting!