Error using ==> inline.subsref at 14 Not enough inputs to inline function.

1 visualizzazione (ultimi 30 giorni)
hi guys
Please if anyone can help me with my code. i face an error that says
**Error using ==> inline.subsref at 14
Not enough inputs to inline function.
x1=-4; x2=5;
F=inline('4*(sqrt(x1^2 + (10-x2)^2 )-10)^2 + 0.5*(sqrt(x1^2 + (10+x2)^2 )-10)^2 -5*(x1+x2)','x1','x2');
for j=1:200
s1=-dF1;
s2=-dF2;% dF1,dF2 can be found
x3=x1+s1*h;
x4=x2+s2*h;
%the problem is i want to use inline function as function of (h).
g=4*(sqrt(x1^3 + (10-x4)^2 )-10)^2 + 0.5*(sqrt(x3^2 + (10+x4)^2 )-10)^2 -5*(x3+x4).
f=inline('g','h');
% later in my loop i will use f(a) where a is known but i always got
*** Error using ==> inline.subsref at 14
Not enough inputs to inline function.
What I need is f as function in h so i can work with.

Risposta accettata

Walter Roberson
Walter Roberson il 18 Mar 2012
Anonymous functions are easier.
F = @(x1, x2) 4*(sqrt(x1^2 + (10-x2)^2 )-10)^2 + 0.5*(sqrt(x1^2 + (10+x2)^2 )-10)^2 -5*(x1+x2); %you do not appear to use F!
g = @(x1, x2, h) 4*(sqrt(x1^3 + (10-(x2+s2*h))^2 )-10)^2 + 0.5*(sqrt((x1+s1*h)^2 + (10+(x2+s2*h))^2 )-10)^2 -5*((x1+s1*h)+(x2+s2*h));
x1 = -4; %are these really constants??
x2 = 5; %are these really constants??
for j = 1 : 200
s1 = -dF1; %is this differential? You cannot differentiate an inline function or an anonymous function
s2 = -dF2; %differentiating what?
f = @(h) g(x1, x2, h);
end
  2 Commenti
Abdulaziz
Abdulaziz il 18 Mar 2012
I appreciate your time.
x1,x2 are changing each loop.
dF1: I just differentiate F separately, outside the program.
I will send you all the program. do not wary about all the steps. the problem occurred because of f=inline('g','h'). I just want to make f as a function of h which i need to find the minimum of f(h), but i can not write h separately I should substitute x3 and x4 which are function of x1,h and x2,h. respectively.
The code is********************
x1=-4; x2=5;
F=inline('4*(sqrt(x1^2 + (10-x2)^2 )-10)^2 + 0.5*(sqrt(x1^2 + (10+x2)^2 )-10)^2 -5*(x1+x2)','x1','x2');
E_n=100; E_t=10^-3;Tol=10^-10;
for j=1:200
dF1=(8*(sqrt(x1^2 + (10-x2)^2) - 10) * x1 )/sqrt(x1^2 + (10-x2)^2) +((1*(sqrt(x1^2 + (10+x2)^2) - 10) * x1 )/sqrt(x1^2 + (10+x2)^2)) - 5 ;
dF2=((8*(sqrt(x1^2 + (10-x2)^2) - 10)*(x2-10)) / (sqrt(x1^2 + (10-x2)^2))) + (((sqrt(x1^2 + (10+x2)^2) - 10)*(10+x2))/(sqrt(x1^2 + (10+x2)^2))) - 5 ;
s1=-dF1;
s2=-dF2;
x3=x1+s1*h;
x4=x2+s2*h;
% now i want to set g as function of h
g=4*(sqrt(x3^2 + (10-x4)^2 )-10)^2 + 0.5*(sqrt(x3^2 + (10+x4)^2)-10)^2 -5*(x3+x2);
f=inline('g','h');
% Finding the bounds on the minimum of the function
%values of the initial bounds [a,b]=[0.0,0.1]
a(1)=0.0;
b(1)=0.1;
r=0.61803;
GSR=1.61803; %Golden Section Ratio = (r/r-1)
c(1)=r*a(1)+(1-r)*b(1); % c is a point between [a,b]
for i=1:100
if if f(a(i))>f(c(i)) && f(b(i))>f(c(i))
% This means there is a minimum value of the function f in the interval [a,b]
break;
else
%since the slope is negative we will shift the interval to the right by
%using the previous values of 'c' and 'b' and the Golden Section Ratio GSR
a(i+1)=c(i); c(i+1)=b(i);
%b can be determined from {(b-c/c-a)=(r/r-1)=GSR, then
b(i+1)=c(i+1)*(1+GSR)-(GSR*a(i+1));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Reduction of original interval using the golden section algorithm.
a(1)=a(i); b(1)=b(i);
c(1)=r*a(1)+(1-r)*b(1);
d(1)=(1-r)*a(1)+r*b(1);% c and d are points between [a,b]
for n=1:100
if f(c(n))<=f(d(n))
a(n+1)=a(n);
b(n+1)=d(n);
d(n+1)=c(n);
c(n+1)=r*a(n+1)+(1-r)*b(n+1);
else
if f(c(n))>f(d(n))
a(n+1)=c(n);
b(n+1)=b(n);
c(n+1)=d(n);
d(n+1)=(1-r)*a(n+1)+r*b(n+1);
end
end
E_n=abs((b(n+1)-a(n+1))/(b(1)-a(1)));
if E_n < E_t;
break
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%cubic plunomyal fit to the points obtained at the last iteration
X1=a(n+1);X2=c(n+1);X3=d(n+1);X4=b(n+1);
q1=X3^3*(X2-X1)-X2^3*(X3-X1)+X1^3*(X3-X2);
q2=X4^3*(X2-X1)-X2^3*(X4-X1)+X1^3*(X4-X2);
q3=(X3-X2)*(X2-X1)*(X3-X1);
q4=(X4-X2)*(X2-X1)*(X4-X1);
q5=f(X3)*(X2-X1)-f(X2)*(X3-X1)+f(X1)*(X3-X2);
q6=f(X4)*(X2-X1)-f(X2)*(X4-X1)+f(X1)*(X4-X2);
a3=(q3*q6-q4*q5)/(q2*q3-q1*q4);
a2=(q5-a3*q1)/q3;
a1=((f(X2)-f(X1))/(X2-X1))-(a3*((X2^3-X1^3)/(X2-X1)))-a2*(X1+X2);
a0=f(X1)-a1*X1-a2*X1^2-a3*X1^3;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% finding the minimum
delta=a2^2-(3*a1*a3);
XI=(sqrt(delta)-a2)/(3*a3); XII=(-a2-sqrt(delta))/(3*a3);
if f(XI)<= f(XII)
h=XI;
else
h=XII;
end
x3=x1+s1*h;
x4=x2+s2*h;% we already used this in lines 11,12 for g=f(h)
if abs(F(x3,x4)-F(x1,x2)) <= 10^-10
break;
end
if j==5
break;
end
x1=x3;
x2=x4;
end
disp('f(x1,x2) x1 x2 iteration');
m=[F(x1,x2),x1,x2,j];
disp(m);
Abdulaziz
Abdulaziz il 19 Mar 2012
HI I really appreciate your help it incredibly works.
I hope I ask in the first day because I worked all two days long to figure it out finally i decided to write to your website.
Thaaaaaaaaaank yoooooo

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Function Creation in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by