diff --git a/+quantity/BasicVariable.m b/+quantity/BasicVariable.m index 3d09b575c963bb1220f22603f5dad5359b64e5b7..d0177ea0ae018d09caddba02c6d921567726f6b8 100644 --- a/+quantity/BasicVariable.m +++ b/+quantity/BasicVariable.m @@ -39,6 +39,8 @@ function obj = BasicVariable(valueContinuous, varargin) if nargin > 0 && ~isempty(varargin) + % #todo + error("This constructor must be reworked!") % make default grid: preParser = misc.Parser(); preParser.addParameter('T', 1); diff --git a/+quantity/Domain.m b/+quantity/Domain.m index 187f6eac0eee8cb217e9aca186d7f80adcb059bf..d7acf37fa27966ab562d038664930161dc5f6114 100644 --- a/+quantity/Domain.m +++ b/+quantity/Domain.m @@ -82,6 +82,14 @@ classdef (InferiorClasses = {?quantity.EquidistantDomain}) Domain < ... quan = quantity.Symbolic(sym(obj.name), obj, 'name', obj.name); end % Symbolic() + function q = Function(obj) + arguments + obj (1,1) quantity.Domain; + end + + q = quantity.Function(eval("@(" + obj.name + ")" + obj.name), obj, 'name', obj.name); + end + end methods (Access = public) @@ -220,8 +228,14 @@ classdef (InferiorClasses = {?quantity.EquidistantDomain}) Domain < ... arguments (Repeating) searchName string; end - - d = obj( obj.gridIndex( searchName ) ); + + idx = obj.gridIndex( searchName ); + + if idx == 0 + d = []; + else + d = obj( idx ); + end end function rest = remove(obj, toBeRemoved) diff --git a/+unittests/+quantity/testDiscrete.m b/+unittests/+quantity/testDiscrete.m index a66b422cf9fec6c844dd6450cff52b2b91c5c945..881c204ce2930cbada25b79a5b1fda1cc95c823b 100644 --- a/+unittests/+quantity/testDiscrete.m +++ b/+unittests/+quantity/testDiscrete.m @@ -4,6 +4,25 @@ function [tests] = testDiscrete() tests = functiontests(localfunctions); end +function testCatBug(tc) + +z = quantity.Domain("z", linspace(0, 1, 7)); +zeta = quantity.Domain("zeta", linspace(0, 1, 5)); +A = quantity.Discrete(sin(z.grid * pi), z); + +x = A * subs(A, "z", "zeta"); +C1 = [0*z.Discrete + zeta.Discrete; x]; +C2 = [zeta.Discrete + 0*z.Discrete; x]; +tc.verifyEqual(C1.on([z, zeta]), C2.on([z, zeta])); + +x = A * subs(A, "z", "zeta"); +C1 = [0*z.Symbolic + zeta.Symbolic; x]; +C2 = [zeta.Symbolic + 0*z.Symbolic; x]; +tc.verifyEqual(C1.on([z, zeta]), C2.on([z, zeta])); + +end + + function testEigScalar(tc) z = quantity.Domain("z", linspace(-1, 1, 11)); [Vz, Dz, Wz] = z.Discrete.eig(); diff --git a/+unittests/+quantity/testFunction.m b/+unittests/+quantity/testFunction.m index 1e46cbcbbe7b95858361874880f9a3464fd97faa..83d001a52672d24dba4f3ae33685dd42520fbe93 100644 --- a/+unittests/+quantity/testFunction.m +++ b/+unittests/+quantity/testFunction.m @@ -4,6 +4,19 @@ function [tests] = testFunction() tests = functiontests(localfunctions); end +function testCatBug(tc) + +z = quantity.Domain("z", linspace(0, 1, 7)); +zeta = quantity.Domain("zeta", linspace(0, 1, 5)); +A = quantity.Function(@(z)sin(z * pi), z); + +x = A * subs(A, "z", "zeta"); +C1 = [0*z.Function + zeta.Function; x]; +C2 = [zeta.Function + 0*z.Function; x]; +tc.verifyEqual(C1.on([z, zeta]), C2.on([z, zeta])); + +end + function testChangeGrid(tc) z = quantity.Domain("z", 0:5); @@ -19,6 +32,7 @@ c = a.changeGrid( linspace(0,5), "z"); end + function testAt(tc) z = quantity.Domain("z", linspace(0, 1, 11)); f = quantity.Function({@(z)sin(z), @(z)1+z; @(z)cos(z), @(z)z.^2}, z); @@ -214,4 +228,4 @@ f = quantity.Function(... verifyEqual(testCase, size(f), [2, 3]); verifyEqual(testCase, size(f, 2), 3); -end \ No newline at end of file +end diff --git a/+unittests/+quantity/testSymbolic.m b/+unittests/+quantity/testSymbolic.m index c8b0dc50407cefd85703f8d149d8601cee98e310..87b447ca0367e560a8bdab3331dac98404d447a7 100644 --- a/+unittests/+quantity/testSymbolic.m +++ b/+unittests/+quantity/testSymbolic.m @@ -8,18 +8,23 @@ function testValueContinuousBug(tc) z = quantity.Domain("z", linspace(0, 1, 7)); zeta = quantity.Domain("zeta", linspace(0, 1, 5)); A = quantity.Symbolic(sin(sym("z") * pi), z); + B1 = [0*z.Symbolic + zeta.Symbolic, A + 0*zeta.Symbolic; ... z.Symbolic+zeta.Symbolic, A * subs(A, "z", "zeta")]; B2 = [zeta.Symbolic + 0*z.Symbolic, A + 0*zeta.Symbolic; ... z.Symbolic+zeta.Symbolic, A * subs(A, "z", "zeta")]; tc.verifyEqual(B1.on([z, zeta]), B2.on([z, zeta])); -C1 = [0*z.Symbolic + zeta.Symbolic, A + 0*zeta.Symbolic]; -c1 = zeta.Symbolic + 0*z.Symbolic; -c2 = A + 0*zeta.Symbolic; -C2 = [c1, c2]; +x = A * subs(A, "z", "zeta"); +C1 = [0*z.Symbolic + zeta.Symbolic; x]; +C2 = [zeta.Symbolic + 0*z.Symbolic; x]; tc.verifyEqual(C1.on([z, zeta]), C2.on([z, zeta])); +e = zeta.Symbolic + 0*z.Symbolic; +e = e.sort(); +f = e.changeGrid({z.grid z.grid}, ["z", "zeta"]); + + % TODO: fix this error! See issue #41 % this problem is maybe caused as input arguments of B2(1).valueContinuous is somehow ordered % differently compared to B2(2:4).valueContinuous or all B(:).valueContinuous,