Hello there, I have a function f(x,t) defined on (0,1). The function is however discontinuous at x=1/2 such that we have two separate values f1(x,t) for x in (0,1/2) and f2(x,t) for x in (1/2, 1). How do I program this function with M function file that takes input x and t?. Arbitrary function can be used to explain. Thanks a lot

4 comentarios

Ced
Ced el 25 de Mzo. de 2016
Just use an if statement checking in what domain your input is, and evaluate accordingly.
Oluwaseun Lijoka
Oluwaseun Lijoka el 25 de Mzo. de 2016
Editada: Walter Roberson el 25 de Mzo. de 2016
Hello Ced, here is what I did. But I was getting error "Output argument "f" (and maybe others) not assigned during call to "exact_soln". Any idea as to why?. Thanks a lot.
function f = exact_soln(x,t,c_1,c_2)
% c_1 and c_2 are velocities on separate domain (0,1/2) and (1/2,1)
fn=@(x)sin(2*pi*x);
if x(x<=1/2)%
f= 1/2*(fn(x+c_1*t) + fn(x-c_1*t));
end
if x(1/2<=x)
f= 1/2*(fn(x+c_2*t) + fn(x-c_2*t));
end
Walter Roberson
Walter Roberson el 25 de Mzo. de 2016
Is x a scalar or a vector?
Oluwaseun Lijoka
Oluwaseun Lijoka el 26 de Mzo. de 2016
x is allowed to be a vector. Mostly computed via quadrature.@Robertson

Iniciar sesión para comentar.

 Respuesta aceptada

Ced
Ced el 25 de Mzo. de 2016
Editada: Ced el 25 de Mzo. de 2016
This means that you have defined a function with an output (in your case the variable f), but have not assigned it. This would happen if x does not fall into any of your cases.
Your if conditions are a bit strange.
(x<=1/2) will return 0 if false, 1 if true. So, if e.g. x = 0, then x(x<=1/2) = x(1) = 0, which is considered false instead of true.
This should work better:
function f = exact_soln(x,t,c_1,c_2)
fn=@(x)sin(2*pi*x);
if x <= 0.5 % domain section 1
f= 0.5*(fn(x+c_1*t) + fn(x-c_1*t));
else % domain section 2, 0.5 < x
f= 0.5*(fn(x+c_2*t) + fn(x-c_2*t));
end
end
Having an else statement ensures that no matter x, f will always get a value.
Note that the boundaries x == 0 and x == 1 are actually not checked! If you need your wave to stop there, you could either add more if/else statements, or simply bound x before hand, i.e.
x = max(min(x,1),0);

1 comentario

Oluwaseun Lijoka
Oluwaseun Lijoka el 25 de Mzo. de 2016
Thanks Ced, I actually extended the solution by f=0 elsewhere before but your idea is simple and better. I also like the idea of bounding x as well. Thanks a lot.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Programming en Centro de ayuda y File Exchange.

Preguntada:

el 25 de Mzo. de 2016

Comentada:

el 26 de Mzo. de 2016

Community Treasure Hunt

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

Start Hunting!

Translated by