Category: News
Appdesigner specific file edition issue
After opening a specific .mlapp, each time I go back to the file tab inside appdesigner, I receive an dialog window : "The file has been modified outside of MATLAB Editor. Do you want to reload it?"
I have this problem only with one specific mlapp file. I have other mlapp files in the same directory for which this issue does not appear.
All these mlapp files are saved locally. They were created from guide apps, using Matlab migration tool.
This issue appears since the mlapp file creation with all the different Matlab releases I used since (R2025a on Linux now).After opening a specific .mlapp, each time I go back to the file tab inside appdesigner, I receive an dialog window : "The file has been modified outside of MATLAB Editor. Do you want to reload it?"
I have this problem only with one specific mlapp file. I have other mlapp files in the same directory for which this issue does not appear.
All these mlapp files are saved locally. They were created from guide apps, using Matlab migration tool.
This issue appears since the mlapp file creation with all the different Matlab releases I used since (R2025a on Linux now). After opening a specific .mlapp, each time I go back to the file tab inside appdesigner, I receive an dialog window : "The file has been modified outside of MATLAB Editor. Do you want to reload it?"
I have this problem only with one specific mlapp file. I have other mlapp files in the same directory for which this issue does not appear.
All these mlapp files are saved locally. They were created from guide apps, using Matlab migration tool.
This issue appears since the mlapp file creation with all the different Matlab releases I used since (R2025a on Linux now). appdesigner MATLAB Answers — New Questions
What are the “CA” and “CB” ports in the “Hybrid Stepper Motor” block for the Specialized Power Systems in Simscape R2024b?
I am trying to set up a 4-phase "Hybrid Stepper Motor". When I use a two-phase motor, I am able to connect it according to the documentation. However, when I try to use the four-phase variant, I see two additional ports "CA" and "CB" appear. However, I cannot find references on these ports or how to connect them in the "Stepper Motor" documentation. What is the physical interpretation of these ports?I am trying to set up a 4-phase "Hybrid Stepper Motor". When I use a two-phase motor, I am able to connect it according to the documentation. However, when I try to use the four-phase variant, I see two additional ports "CA" and "CB" appear. However, I cannot find references on these ports or how to connect them in the "Stepper Motor" documentation. What is the physical interpretation of these ports? I am trying to set up a 4-phase "Hybrid Stepper Motor". When I use a two-phase motor, I am able to connect it according to the documentation. However, when I try to use the four-phase variant, I see two additional ports "CA" and "CB" appear. However, I cannot find references on these ports or how to connect them in the "Stepper Motor" documentation. What is the physical interpretation of these ports? phasewinding, specializedpowersystems, simscapeelectrical, steppermotor MATLAB Answers — New Questions
How do I turn this Simulink model with Gain Control to Pole Placement?
Hi All
I have already calculated the gains for acceleration and velocity but my block is state space and gives displacement and velocity. I just dont know , what should I do with displacement, or should I leave disp and vel and only control acceleration with one gain or acc and vel ?? I have added 2 Zero pole blocks, which defined the new gains. but then It seems like State Space is not coincident with this methodHi All
I have already calculated the gains for acceleration and velocity but my block is state space and gives displacement and velocity. I just dont know , what should I do with displacement, or should I leave disp and vel and only control acceleration with one gain or acc and vel ?? I have added 2 Zero pole blocks, which defined the new gains. but then It seems like State Space is not coincident with this method Hi All
I have already calculated the gains for acceleration and velocity but my block is state space and gives displacement and velocity. I just dont know , what should I do with displacement, or should I leave disp and vel and only control acceleration with one gain or acc and vel ?? I have added 2 Zero pole blocks, which defined the new gains. but then It seems like State Space is not coincident with this method simulink, control MATLAB Answers — New Questions
How to read Audio File into Vector?
Hello, I have to read a Audio File (.wav) into a vector.
I know how to plot it:
info = audioinfo(‘sound.wav’);
[y, Fs] = audioread(‘sound.wav’);
t = 0:1/Fs:info.Duration;
t = t(1:end-1);
plot(t,y);
xlabel(‘Time’);
ylabel(‘Audio Signal’);
But this Sript does not read the Audio into a Vector.
I also tried to read every single Sample, but this is to complex and I get error after error. Is there a simple way to do this?Hello, I have to read a Audio File (.wav) into a vector.
I know how to plot it:
info = audioinfo(‘sound.wav’);
[y, Fs] = audioread(‘sound.wav’);
t = 0:1/Fs:info.Duration;
t = t(1:end-1);
plot(t,y);
xlabel(‘Time’);
ylabel(‘Audio Signal’);
But this Sript does not read the Audio into a Vector.
I also tried to read every single Sample, but this is to complex and I get error after error. Is there a simple way to do this? Hello, I have to read a Audio File (.wav) into a vector.
I know how to plot it:
info = audioinfo(‘sound.wav’);
[y, Fs] = audioread(‘sound.wav’);
t = 0:1/Fs:info.Duration;
t = t(1:end-1);
plot(t,y);
xlabel(‘Time’);
ylabel(‘Audio Signal’);
But this Sript does not read the Audio into a Vector.
I also tried to read every single Sample, but this is to complex and I get error after error. Is there a simple way to do this? vector, audio, sound MATLAB Answers — New Questions
Building Toolbox in cI with matlab runtime
Hello experts
I am trying to automate my toolbox creation in gitlab ci and trying to find the best way to do this.
I looked at using the matlab runtime docker for my purpose, looking at the documentation it says matlab runtime docker is used for executing matlab apps, can i also use it to build the toolbox?
Do i need to use the matlab docker with license to build the toolbox?
Is there a lighter matlab installation that serves the purpose?
Any guidance will be appreciated.
ThanksHello experts
I am trying to automate my toolbox creation in gitlab ci and trying to find the best way to do this.
I looked at using the matlab runtime docker for my purpose, looking at the documentation it says matlab runtime docker is used for executing matlab apps, can i also use it to build the toolbox?
Do i need to use the matlab docker with license to build the toolbox?
Is there a lighter matlab installation that serves the purpose?
Any guidance will be appreciated.
Thanks Hello experts
I am trying to automate my toolbox creation in gitlab ci and trying to find the best way to do this.
I looked at using the matlab runtime docker for my purpose, looking at the documentation it says matlab runtime docker is used for executing matlab apps, can i also use it to build the toolbox?
Do i need to use the matlab docker with license to build the toolbox?
Is there a lighter matlab installation that serves the purpose?
Any guidance will be appreciated.
Thanks toolbox, cli MATLAB Answers — New Questions
How to Report DLP Alerts
Use the Graph API to Report Information about DLP Alerts
MC1169572 (10 October 2025, Microsoft 365 roadmap item 511795) announced a new ability for administrators to add classifications to DLP alerts. The update should now be available in all tenants.
DLP signals alerts when policy rules detect a violation. The update allows administrators to note if the alert is a false positive, true positive, or benign positive (one that you don’t need to worry about) when reviewing the status of alerts (Figure 1). Although I could update the classifier for DLP alerts, any attempt to update the comments for an alert through the UX failed.

Alerts generated for DLP events are synchronized bi-directionally with Defender.
Tenant don’t have to classify events, but MC1169572 says that tenants can “use the classification property to enhance reporting and incident response.” Which then creates the question of how to report DLP alerts.
The Graph Alert Resource Type
The answer is that alert data is available through the alert resource type from the Graph Security API. For example, this Graph request against the alerts_v2 endpoint filters on the serviceSource property to find the set of DLP alerts. We can see the classification entered for the alert.
$Uri = "https://graph.microsoft.com/v1.0/security/alerts_v2?`$filter=serviceSource eq 'DataLossPrevention'&`$orderby=createdDateTime desc&`$top=200" [array]$Alerts = Invoke-MgGraphRequest -Method GET -Uri $Uri -OutputType PSObject $Alerts = $Alerts.Value $Alerts | Format-Table ServiceSource, CreatedDateTime, Title, Classification serviceSource createdDateTime title classification ------------- --------------- ----- -------------- dataLossPrevention 11/12/2025 14:41:47 DLP-Block Confidential Documents truePositive dataLossPrevention 20/11/2025 01:33:40 DLP-DLP Policy for Sensitive Data 1 dataLossPrevention 20/11/2025 01:27:41 DLP-DLP Policy for Sensitive Data 1 dataLossPrevention 20/11/2025 01:26:09 DLP-DLP Policy for Sensitive Data 1
The Alerts resource caters for alerts generated by many other solutions, including Defender for Identity, Defender for Cloud Apps, Defender for Office 365, App governance, threat intelligence, and so on.
Working with DLP Alerts via the Microsoft Graph PowerShell SDK
Graph API requests can also be made through Microsoft Graph PowerShell SDK cmdlets. In this case, the Get-MgSecurityAlertV2 cmdlet (from the Microsoft.Graph.Security module) does the same job as the request discussed above.
Before attempting to work with security alerts, make sure that the signed in account is a security administrator and that the delegated SecurityAlert.Read.All permission (scope) is available:
[array]$DLPAlerts = Get-MgSecurityAlertV2 -Filter "serviceSource eq 'dataLossPrevention'" -PageSize 500 -All -Sort "CreatedDateTime Desc" $DLPAlerts | Format-Table ServiceSource, CreatedDateTime, Title, Classification ServiceSource CreatedDateTime Title Classification ------------- --------------- ----- -------------- dataLossPrevention 11/12/2025 14:41:47 DLP-Block Confidential Documents truePositive dataLossPrevention 20/11/2025 01:33:40 DLP-DLP Policy for Sensitive Data 1 dataLossPrevention 20/11/2025 01:27:41 DLP-DLP Policy for Sensitive Data 1 dataLossPrevention 20/11/2025 01:26:09 DLP-DLP Policy for Sensitive Data 1
Note: after updating an alert with a classification, it takes a few seconds before the update appears in the alert record available through the Graph.
Updating a DLP Alert with PowerShell
It’s also possible to set a classification for an alert with the Update-MgSecurityAlertV2 cmdlet. In this example, a hash table holds several properties as input to update an alert, including the classification.
$AlertId = $DLPAlerts[1].Id
$Parameters = @{}
$Parameters.Add("determination", "other")
$Parameters.Add("status", "inProgress")
$Parameters.Add("assignedTo", "Hans.Geering@office365itpros.com")
$Parameters.Add("classification", "truePositive")
Update-MgSecurityAlertV2 -AlertId $AlertId -BodyParameter $Parameters
Reporting DLP Alerts
Once we know how to retrieve DLP alerts, it’s easy to create a basic report. Figure 2 shows the result:
$Report = [System.Collections.Generic.List[Object]]::new()
ForEach ($Alert in $DLPAlerts) {
If ($Alert.LastUpdateDateTime) { $LastUpdated = Get-Date $Alert.LastUpdateDateTime -Format 'dd-MMM-yyyy HH:mm'
} Else {
$LastUpdated = "N/A"
}
$ReportLine = [PSCustomObject][Ordered]@{
Id = $Alert.id
Title = $Alert.title
CreatedDateTime = Get-Date $Alert.createdDateTime -Format 'dd-MMM-yyyy HH:mm'
Severity = $Alert.severity
Status = $Alert.status
Category = $Alert.category
AssignedTo = $Alert.AssignedTo
LastUpdateDateTime = $LastUpdated
Classification = $Alert.classification
}
$Report.Add($ReportLine)
}

I hate seeing something in a message center notification that I can’t quite figure out how to do. I’ve never really thought about working with DLP alerts through PowerShell in the past, but I’m glad that the addition of administrator-controlled classifications to DLP alerts prompted me to check out how to report this information.
Need help to write and manage PowerShell scripts for Microsoft 365, including Azure Automation runbooks? Get a copy of the Automating Microsoft 365 with PowerShell eBook, available standalone or as part of the Office 365 for IT Pros eBook bundle.
Construct voronoi diagram on a point cloud
I have a point cloud file in the .pcd format. I want to calculate a Voronoi diagram for this .pcd file. I also have a set of points with x and y coordinates that were extracted from the .pcd file. I want to calculate the Voronoi diagram based on these x and y coordinates. My objective is to divide the point cloud into zones corresponding to these points (x, y). So far, I have written the following code but it seems like there is no connection between the point cloud and x-y coordinates. How can I relate the point cloud and the co ordinates?
ptCloud = pcread("test_obj6.pcd");
x = [ 7.0267 4.8436 4.8767 2.8000];
y = [ 4.2001 4.5947 2.1412 3.2000];
voronoi(x,y)I have a point cloud file in the .pcd format. I want to calculate a Voronoi diagram for this .pcd file. I also have a set of points with x and y coordinates that were extracted from the .pcd file. I want to calculate the Voronoi diagram based on these x and y coordinates. My objective is to divide the point cloud into zones corresponding to these points (x, y). So far, I have written the following code but it seems like there is no connection between the point cloud and x-y coordinates. How can I relate the point cloud and the co ordinates?
ptCloud = pcread("test_obj6.pcd");
x = [ 7.0267 4.8436 4.8767 2.8000];
y = [ 4.2001 4.5947 2.1412 3.2000];
voronoi(x,y) I have a point cloud file in the .pcd format. I want to calculate a Voronoi diagram for this .pcd file. I also have a set of points with x and y coordinates that were extracted from the .pcd file. I want to calculate the Voronoi diagram based on these x and y coordinates. My objective is to divide the point cloud into zones corresponding to these points (x, y). So far, I have written the following code but it seems like there is no connection between the point cloud and x-y coordinates. How can I relate the point cloud and the co ordinates?
ptCloud = pcread("test_obj6.pcd");
x = [ 7.0267 4.8436 4.8767 2.8000];
y = [ 4.2001 4.5947 2.1412 3.2000];
voronoi(x,y) matlab MATLAB Answers — New Questions
This simulation is given from website but i am unable to understand how these blocks and subsystem works togather , can anyone explain briefly
Post Content Post Content dfig npc converter MATLAB Answers — New Questions
matlab -batch on SLURM prints errors when HOME is shared across many nodes
When launching MATLAB in batch mode on a SLURM cluster, stderr shows:
terminate called after throwing an instance of ‘matlabconnector::installationsregistry::InstallationsRegistryError’
what(): InstallationsRegistry:getMatlabConnectorVersion: More than one MATLAB Connector records were found
This appears during startup (even for a simple command like matlab -batch "disp(version); exit").
sbatch command (PROGLIST=/work/share/…/matlab2024a/bin/matlab):
srun "$PROGLIST" -batch "$CMD"
Find files in ~/.MATLABConnector as below:
~/.MATLABConnector/b01r2n13/LatestInstall.info
~/.MATLABConnector/b01r2n13/UpdatePending.json
~/.MATLABConnector/b01r2n13/locks
~/.MATLABConnector/b02r2n01/LatestInstall.info
~/.MATLABConnector/b02r2n01/UpdatePending.json
~/.MATLABConnector/b02r2n01/locks
…
Questions
Is this a known issue with MATLAB Connector on HPC systems where $HOME is shared across many nodes?
How to prevent MATLAB from throwing this error at startup?When launching MATLAB in batch mode on a SLURM cluster, stderr shows:
terminate called after throwing an instance of ‘matlabconnector::installationsregistry::InstallationsRegistryError’
what(): InstallationsRegistry:getMatlabConnectorVersion: More than one MATLAB Connector records were found
This appears during startup (even for a simple command like matlab -batch "disp(version); exit").
sbatch command (PROGLIST=/work/share/…/matlab2024a/bin/matlab):
srun "$PROGLIST" -batch "$CMD"
Find files in ~/.MATLABConnector as below:
~/.MATLABConnector/b01r2n13/LatestInstall.info
~/.MATLABConnector/b01r2n13/UpdatePending.json
~/.MATLABConnector/b01r2n13/locks
~/.MATLABConnector/b02r2n01/LatestInstall.info
~/.MATLABConnector/b02r2n01/UpdatePending.json
~/.MATLABConnector/b02r2n01/locks
…
Questions
Is this a known issue with MATLAB Connector on HPC systems where $HOME is shared across many nodes?
How to prevent MATLAB from throwing this error at startup? When launching MATLAB in batch mode on a SLURM cluster, stderr shows:
terminate called after throwing an instance of ‘matlabconnector::installationsregistry::InstallationsRegistryError’
what(): InstallationsRegistry:getMatlabConnectorVersion: More than one MATLAB Connector records were found
This appears during startup (even for a simple command like matlab -batch "disp(version); exit").
sbatch command (PROGLIST=/work/share/…/matlab2024a/bin/matlab):
srun "$PROGLIST" -batch "$CMD"
Find files in ~/.MATLABConnector as below:
~/.MATLABConnector/b01r2n13/LatestInstall.info
~/.MATLABConnector/b01r2n13/UpdatePending.json
~/.MATLABConnector/b01r2n13/locks
~/.MATLABConnector/b02r2n01/LatestInstall.info
~/.MATLABConnector/b02r2n01/UpdatePending.json
~/.MATLABConnector/b02r2n01/locks
…
Questions
Is this a known issue with MATLAB Connector on HPC systems where $HOME is shared across many nodes?
How to prevent MATLAB from throwing this error at startup? linux, batch MATLAB Answers — New Questions
Linear interpolation with interp1 is slow: How to improve run times?
I wrote a MWE to compare the perforance of interp1 (MATLAB built-in) with my custom interp1_scal (for linear interpolation), using a simple dynamic programming problem solved with value function iteration
$$ V(k) = max_{k’} log(k^alpha-k’)+beta*V(k’) $$
Question 1: I am a bit surprised that the custom interpolation routine I wrote is much faster than the built-in interp1 for linear interpolation (on my laptop with R2024b, it is 4 times faster, here (RUN button) the speed advantage is smaller but still significant). To find the location of the query point xi on the x grid, I am using binary search (see function locate), directly translated from an older Fortran/C routine.
Question 2: Am I using interp1 in the wrong way? would using griddedInterp or other Matlab routines significantly improve run times of this MWE?
Any help, suggestions or comments is greatly appreciated!
P.S. I am glad to provide additional info on the dynamic programming problem that this simple MWE is meant to caputure in few lines of code, if someone asks for.
Minimum Working Example here:
clear,clc,close all
%% Parameters
maxit = 50;
tol = 1e-5;
alpha = 0.33;
beta = 0.96;
k_ss = (alpha * beta)^(1 / (1 – alpha));
n_k = 300;
k_min = 0.5 * k_ss;
k_max = 1.5 * k_ss;
k_grid = linspace(k_min, k_max, n_k)’;
% Precompute output y = k^alpha
y_grid = k_grid .^ alpha;
%% Method 1: value function iteration with Matlab built-in interpolation
tic
% Initialization
V0 = zeros(n_k, 1);
V1 = zeros(n_k, 1);
% Value Function Iteration
for iter=1:maxit
for i = 1:n_k
y_val = y_grid(i);
k_max_now = min(y_val, k_max); % upper bound for Brent minimization
% Objective function (negative value for minimization)
obj = @(kp) -(log(y_val-kp) + beta*interp1(k_grid,V0,kp,’linear’));
% Optimal policy
kp_opt = fminbnd(obj, k_min, k_max_now);
% Updated value function
V1(i) = -obj(kp_opt);
end
% Convergence check
err = max(abs(V1 – V0));
V0 = V1;
end %end iter
time_vfi1=toc;
%% Method 2: value function iteration with *custom* interpolation
tic
% Initialization
V0 = zeros(n_k, 1);
V2 = zeros(n_k, 1);
% Value Function Iteration
for iter=1:maxit
for i_k = 1:n_k
y_val = y_grid(i_k);
k_max_now = min(y_val, k_max);
% Objective function (negative value for minimization)
obj = @(kp) -( log(y_val-kp) + beta*interp1_scal(k_grid,V0,kp) );
% Optimal policy
kp_opt = fminbnd(obj, k_min, k_max_now);
% Updated value function
V2(i_k) = -obj(kp_opt);
end
% Convergence check
err = max(abs(V2 – V0));
V0 = V2;
end %end iter
time_vfi2=toc;
%% Compare vfi1 and vfi2
err_V = max(abs(V1-V2));
disp(‘RESULTS OF COMPARISON’)
fprintf(‘||V1-V2|| = %f n’,err_V)
fprintf(‘Run time of vfi1 with Matlab interp = %f n’,time_vfi1)
fprintf(‘Run time of vfi2 with custom interp = %f n’,time_vfi2)
fprintf(‘time vfi1 / time_vfi2 = %f n’,time_vfi1/time_vfi2)
%% Plot value function
figure;
plot(k_grid, V1, ‘LineWidth’, 1.5);
hold on
plot(k_grid, V2, ‘LineWidth’, 1.5);
legend(‘V1′,’V2’)
xlabel(‘Current capital’);
grid on;
% Fast linear interpolation routine
% Usage:
% yi = interp1_scal(x,y,xi)
% where x and y are column vectors with n elements, xi is a scalar
% and yi is a scalar
% Input Arguments
% x – Sample points
% column vector
% Y – Sample data
% column vector
% xi – Query point
% scalar
function yi = interp1_scal(x,y,xi)
n = size(x,1);
j = locate(x,xi);
j = max(min(j,n-1),1);
slope = (y(j+1)-y(j))/(x(j+1)-x(j));
yi = y(j)+(xi-x(j))*slope;
end %end function interp1_scal
function jl = locate(xx,x)
%function jl = locate(xx,x)
%
% x is between xx(jl) and xx(jl+1)
%
% jl = 0 and jl = n means x is out of range
%
% xx is assumed to be monotone increasing
n = length(xx);
if x<xx(1)
jl = 0;
elseif x>xx(n)
jl = n;
else
jl = 1;
ju = n;
while (ju-jl>1)
jm = floor((ju+jl)/2);
if x>=xx(jm)
jl = jm;
else
ju=jm;
end
end
end
end %end function locateI wrote a MWE to compare the perforance of interp1 (MATLAB built-in) with my custom interp1_scal (for linear interpolation), using a simple dynamic programming problem solved with value function iteration
$$ V(k) = max_{k’} log(k^alpha-k’)+beta*V(k’) $$
Question 1: I am a bit surprised that the custom interpolation routine I wrote is much faster than the built-in interp1 for linear interpolation (on my laptop with R2024b, it is 4 times faster, here (RUN button) the speed advantage is smaller but still significant). To find the location of the query point xi on the x grid, I am using binary search (see function locate), directly translated from an older Fortran/C routine.
Question 2: Am I using interp1 in the wrong way? would using griddedInterp or other Matlab routines significantly improve run times of this MWE?
Any help, suggestions or comments is greatly appreciated!
P.S. I am glad to provide additional info on the dynamic programming problem that this simple MWE is meant to caputure in few lines of code, if someone asks for.
Minimum Working Example here:
clear,clc,close all
%% Parameters
maxit = 50;
tol = 1e-5;
alpha = 0.33;
beta = 0.96;
k_ss = (alpha * beta)^(1 / (1 – alpha));
n_k = 300;
k_min = 0.5 * k_ss;
k_max = 1.5 * k_ss;
k_grid = linspace(k_min, k_max, n_k)’;
% Precompute output y = k^alpha
y_grid = k_grid .^ alpha;
%% Method 1: value function iteration with Matlab built-in interpolation
tic
% Initialization
V0 = zeros(n_k, 1);
V1 = zeros(n_k, 1);
% Value Function Iteration
for iter=1:maxit
for i = 1:n_k
y_val = y_grid(i);
k_max_now = min(y_val, k_max); % upper bound for Brent minimization
% Objective function (negative value for minimization)
obj = @(kp) -(log(y_val-kp) + beta*interp1(k_grid,V0,kp,’linear’));
% Optimal policy
kp_opt = fminbnd(obj, k_min, k_max_now);
% Updated value function
V1(i) = -obj(kp_opt);
end
% Convergence check
err = max(abs(V1 – V0));
V0 = V1;
end %end iter
time_vfi1=toc;
%% Method 2: value function iteration with *custom* interpolation
tic
% Initialization
V0 = zeros(n_k, 1);
V2 = zeros(n_k, 1);
% Value Function Iteration
for iter=1:maxit
for i_k = 1:n_k
y_val = y_grid(i_k);
k_max_now = min(y_val, k_max);
% Objective function (negative value for minimization)
obj = @(kp) -( log(y_val-kp) + beta*interp1_scal(k_grid,V0,kp) );
% Optimal policy
kp_opt = fminbnd(obj, k_min, k_max_now);
% Updated value function
V2(i_k) = -obj(kp_opt);
end
% Convergence check
err = max(abs(V2 – V0));
V0 = V2;
end %end iter
time_vfi2=toc;
%% Compare vfi1 and vfi2
err_V = max(abs(V1-V2));
disp(‘RESULTS OF COMPARISON’)
fprintf(‘||V1-V2|| = %f n’,err_V)
fprintf(‘Run time of vfi1 with Matlab interp = %f n’,time_vfi1)
fprintf(‘Run time of vfi2 with custom interp = %f n’,time_vfi2)
fprintf(‘time vfi1 / time_vfi2 = %f n’,time_vfi1/time_vfi2)
%% Plot value function
figure;
plot(k_grid, V1, ‘LineWidth’, 1.5);
hold on
plot(k_grid, V2, ‘LineWidth’, 1.5);
legend(‘V1′,’V2’)
xlabel(‘Current capital’);
grid on;
% Fast linear interpolation routine
% Usage:
% yi = interp1_scal(x,y,xi)
% where x and y are column vectors with n elements, xi is a scalar
% and yi is a scalar
% Input Arguments
% x – Sample points
% column vector
% Y – Sample data
% column vector
% xi – Query point
% scalar
function yi = interp1_scal(x,y,xi)
n = size(x,1);
j = locate(x,xi);
j = max(min(j,n-1),1);
slope = (y(j+1)-y(j))/(x(j+1)-x(j));
yi = y(j)+(xi-x(j))*slope;
end %end function interp1_scal
function jl = locate(xx,x)
%function jl = locate(xx,x)
%
% x is between xx(jl) and xx(jl+1)
%
% jl = 0 and jl = n means x is out of range
%
% xx is assumed to be monotone increasing
n = length(xx);
if x<xx(1)
jl = 0;
elseif x>xx(n)
jl = n;
else
jl = 1;
ju = n;
while (ju-jl>1)
jm = floor((ju+jl)/2);
if x>=xx(jm)
jl = jm;
else
ju=jm;
end
end
end
end %end function locate I wrote a MWE to compare the perforance of interp1 (MATLAB built-in) with my custom interp1_scal (for linear interpolation), using a simple dynamic programming problem solved with value function iteration
$$ V(k) = max_{k’} log(k^alpha-k’)+beta*V(k’) $$
Question 1: I am a bit surprised that the custom interpolation routine I wrote is much faster than the built-in interp1 for linear interpolation (on my laptop with R2024b, it is 4 times faster, here (RUN button) the speed advantage is smaller but still significant). To find the location of the query point xi on the x grid, I am using binary search (see function locate), directly translated from an older Fortran/C routine.
Question 2: Am I using interp1 in the wrong way? would using griddedInterp or other Matlab routines significantly improve run times of this MWE?
Any help, suggestions or comments is greatly appreciated!
P.S. I am glad to provide additional info on the dynamic programming problem that this simple MWE is meant to caputure in few lines of code, if someone asks for.
Minimum Working Example here:
clear,clc,close all
%% Parameters
maxit = 50;
tol = 1e-5;
alpha = 0.33;
beta = 0.96;
k_ss = (alpha * beta)^(1 / (1 – alpha));
n_k = 300;
k_min = 0.5 * k_ss;
k_max = 1.5 * k_ss;
k_grid = linspace(k_min, k_max, n_k)’;
% Precompute output y = k^alpha
y_grid = k_grid .^ alpha;
%% Method 1: value function iteration with Matlab built-in interpolation
tic
% Initialization
V0 = zeros(n_k, 1);
V1 = zeros(n_k, 1);
% Value Function Iteration
for iter=1:maxit
for i = 1:n_k
y_val = y_grid(i);
k_max_now = min(y_val, k_max); % upper bound for Brent minimization
% Objective function (negative value for minimization)
obj = @(kp) -(log(y_val-kp) + beta*interp1(k_grid,V0,kp,’linear’));
% Optimal policy
kp_opt = fminbnd(obj, k_min, k_max_now);
% Updated value function
V1(i) = -obj(kp_opt);
end
% Convergence check
err = max(abs(V1 – V0));
V0 = V1;
end %end iter
time_vfi1=toc;
%% Method 2: value function iteration with *custom* interpolation
tic
% Initialization
V0 = zeros(n_k, 1);
V2 = zeros(n_k, 1);
% Value Function Iteration
for iter=1:maxit
for i_k = 1:n_k
y_val = y_grid(i_k);
k_max_now = min(y_val, k_max);
% Objective function (negative value for minimization)
obj = @(kp) -( log(y_val-kp) + beta*interp1_scal(k_grid,V0,kp) );
% Optimal policy
kp_opt = fminbnd(obj, k_min, k_max_now);
% Updated value function
V2(i_k) = -obj(kp_opt);
end
% Convergence check
err = max(abs(V2 – V0));
V0 = V2;
end %end iter
time_vfi2=toc;
%% Compare vfi1 and vfi2
err_V = max(abs(V1-V2));
disp(‘RESULTS OF COMPARISON’)
fprintf(‘||V1-V2|| = %f n’,err_V)
fprintf(‘Run time of vfi1 with Matlab interp = %f n’,time_vfi1)
fprintf(‘Run time of vfi2 with custom interp = %f n’,time_vfi2)
fprintf(‘time vfi1 / time_vfi2 = %f n’,time_vfi1/time_vfi2)
%% Plot value function
figure;
plot(k_grid, V1, ‘LineWidth’, 1.5);
hold on
plot(k_grid, V2, ‘LineWidth’, 1.5);
legend(‘V1′,’V2’)
xlabel(‘Current capital’);
grid on;
% Fast linear interpolation routine
% Usage:
% yi = interp1_scal(x,y,xi)
% where x and y are column vectors with n elements, xi is a scalar
% and yi is a scalar
% Input Arguments
% x – Sample points
% column vector
% Y – Sample data
% column vector
% xi – Query point
% scalar
function yi = interp1_scal(x,y,xi)
n = size(x,1);
j = locate(x,xi);
j = max(min(j,n-1),1);
slope = (y(j+1)-y(j))/(x(j+1)-x(j));
yi = y(j)+(xi-x(j))*slope;
end %end function interp1_scal
function jl = locate(xx,x)
%function jl = locate(xx,x)
%
% x is between xx(jl) and xx(jl+1)
%
% jl = 0 and jl = n means x is out of range
%
% xx is assumed to be monotone increasing
n = length(xx);
if x<xx(1)
jl = 0;
elseif x>xx(n)
jl = n;
else
jl = 1;
ju = n;
while (ju-jl>1)
jm = floor((ju+jl)/2);
if x>=xx(jm)
jl = jm;
else
ju=jm;
end
end
end
end %end function locate interp1, linear interpolation MATLAB Answers — New Questions
How Does interp1 Work if the Sample Points are not Monotonic?
Forever I’ve thought that the sample points input to @doc:interp1 have to be distinct AND monotonic. But I just saw on the doc page that distinct is the only requirement.
For example:
matlabRelease
x = [1,3,0,2]; % not monotonic
y = sin(x);
xq = 1.5;
yi = interp1(x,y,xq)
I’m quite surprised by this result.
Does interp1 sort the sample points and reorder the sample values if the sample points are not monotonic?
The same answer is obtained:
isequal(yi,interp1(sort(x),sin(sort(x)),xq))Forever I’ve thought that the sample points input to @doc:interp1 have to be distinct AND monotonic. But I just saw on the doc page that distinct is the only requirement.
For example:
matlabRelease
x = [1,3,0,2]; % not monotonic
y = sin(x);
xq = 1.5;
yi = interp1(x,y,xq)
I’m quite surprised by this result.
Does interp1 sort the sample points and reorder the sample values if the sample points are not monotonic?
The same answer is obtained:
isequal(yi,interp1(sort(x),sin(sort(x)),xq)) Forever I’ve thought that the sample points input to @doc:interp1 have to be distinct AND monotonic. But I just saw on the doc page that distinct is the only requirement.
For example:
matlabRelease
x = [1,3,0,2]; % not monotonic
y = sin(x);
xq = 1.5;
yi = interp1(x,y,xq)
I’m quite surprised by this result.
Does interp1 sort the sample points and reorder the sample values if the sample points are not monotonic?
The same answer is obtained:
isequal(yi,interp1(sort(x),sin(sort(x)),xq)) interp1, montonic, sample points MATLAB Answers — New Questions
How to run “Use FPGA I/O to Communicate with FPGA” example in a repetitive For-Loop?
Hi,
For the example “Use FPGA I/O to Communicate with FPGA”, I followed all the documented steps exactly. I was able to generate the bitstream for the ZCU102 with FMCOM2/3 and successfully program the board using the generated bitstream.
Next, I copied the MATLAB code from the example page and ran it to transmit and receive a chirp signal using RF loopback. I can observe both the TX and RX power correctly. When I run the code a single time, it works as expected and I obtain the correct input and output signals.
However, I need to run this example inside a for-loop to transmit and receive data multiple times. I understand that on the rising edge of the "txStart" signal, TVALID pulses are generated on both the TX and RX sides. In the for-loop, the start signal is toggled by writing 1 and then 0, and the stream write and stream read operations are also executed.
I have tried different combinations of toggling the start signal and performing the stream read/write operations, but the behavior is not correct. Specifically, only one out of every three iterations receives the data correctly. you can find attached one of the multiple codes that I tried.
Could you please provide a MATLAB .m script that works correctly with this example when executed inside a for-loop? Are you able to send and receive data properly multiple times?
Thanks.Hi,
For the example “Use FPGA I/O to Communicate with FPGA”, I followed all the documented steps exactly. I was able to generate the bitstream for the ZCU102 with FMCOM2/3 and successfully program the board using the generated bitstream.
Next, I copied the MATLAB code from the example page and ran it to transmit and receive a chirp signal using RF loopback. I can observe both the TX and RX power correctly. When I run the code a single time, it works as expected and I obtain the correct input and output signals.
However, I need to run this example inside a for-loop to transmit and receive data multiple times. I understand that on the rising edge of the "txStart" signal, TVALID pulses are generated on both the TX and RX sides. In the for-loop, the start signal is toggled by writing 1 and then 0, and the stream write and stream read operations are also executed.
I have tried different combinations of toggling the start signal and performing the stream read/write operations, but the behavior is not correct. Specifically, only one out of every three iterations receives the data correctly. you can find attached one of the multiple codes that I tried.
Could you please provide a MATLAB .m script that works correctly with this example when executed inside a for-loop? Are you able to send and receive data properly multiple times?
Thanks. Hi,
For the example “Use FPGA I/O to Communicate with FPGA”, I followed all the documented steps exactly. I was able to generate the bitstream for the ZCU102 with FMCOM2/3 and successfully program the board using the generated bitstream.
Next, I copied the MATLAB code from the example page and ran it to transmit and receive a chirp signal using RF loopback. I can observe both the TX and RX power correctly. When I run the code a single time, it works as expected and I obtain the correct input and output signals.
However, I need to run this example inside a for-loop to transmit and receive data multiple times. I understand that on the rising edge of the "txStart" signal, TVALID pulses are generated on both the TX and RX sides. In the for-loop, the start signal is toggled by writing 1 and then 0, and the stream write and stream read operations are also executed.
I have tried different combinations of toggling the start signal and performing the stream read/write operations, but the behavior is not correct. Specifically, only one out of every three iterations receives the data correctly. you can find attached one of the multiple codes that I tried.
Could you please provide a MATLAB .m script that works correctly with this example when executed inside a for-loop? Are you able to send and receive data properly multiple times?
Thanks. hdl coder, zcu102, fmcomm2 MATLAB Answers — New Questions
Where to find the default HDL project for ZedBoard or ZCU102 FMCOMMS2/3/4 Xilinx Zynq-Based Radio Linux image?
Hi,
The Communications Toolbox Support Package for Xilinx Zynq-Based Radio uses a default operating system image, which is written to the SD card during the Hardware Setup process.
My question is: where can I find the HDL Coder (or Vivado) project that generates the same FPGA bitstream (system.bit) used in this default Linux image?
More specifically, I am looking for a MATLAB/HDL-based reference project that produces exactly the same bitstream as the one included in the prebuilt Linux image provided by the support package, and then I can program my target with that.
Is this reference HDL project available to users?
If not, is there documentation describing how the default bitstream was generated and how to reproduce it?
Thank you.Hi,
The Communications Toolbox Support Package for Xilinx Zynq-Based Radio uses a default operating system image, which is written to the SD card during the Hardware Setup process.
My question is: where can I find the HDL Coder (or Vivado) project that generates the same FPGA bitstream (system.bit) used in this default Linux image?
More specifically, I am looking for a MATLAB/HDL-based reference project that produces exactly the same bitstream as the one included in the prebuilt Linux image provided by the support package, and then I can program my target with that.
Is this reference HDL project available to users?
If not, is there documentation describing how the default bitstream was generated and how to reproduce it?
Thank you. Hi,
The Communications Toolbox Support Package for Xilinx Zynq-Based Radio uses a default operating system image, which is written to the SD card during the Hardware Setup process.
My question is: where can I find the HDL Coder (or Vivado) project that generates the same FPGA bitstream (system.bit) used in this default Linux image?
More specifically, I am looking for a MATLAB/HDL-based reference project that produces exactly the same bitstream as the one included in the prebuilt Linux image provided by the support package, and then I can program my target with that.
Is this reference HDL project available to users?
If not, is there documentation describing how the default bitstream was generated and how to reproduce it?
Thank you. hdl coder, zcu102, xilinx based readio, fcomms2 MATLAB Answers — New Questions
How to generate orthogonal X-ray Projection, Digitally Reconstructed Radiographs (DRR), from a particular CT volume
Hello everyone,
I am simulating Orthogonal X-ray Projection, specifically Digitally Reconstructed Radiographs (DRR), from a particular CT volume.
To accomplish this, I first created a CT volume and then used the "generateOptimizedXrayProjections" function to produce DRR for both the anteroposterior (AP) and lateral projections.
1. To view the results from this process, please refer to lines 34-35 and line 53. When I run this simulation, I can see the DRR results.
2. However, when I used a real CT image (lines 38-39 and line 54), the generated DRR appeared completely dark.
My goal is to generate a DRR from a real CT image, such as CT_13.nii.gz.
I would greatly appreciate any insights or suggestions regarding this code.
Attached below are the MATLAB code (zip file) for reference.
Thank you!Hello everyone,
I am simulating Orthogonal X-ray Projection, specifically Digitally Reconstructed Radiographs (DRR), from a particular CT volume.
To accomplish this, I first created a CT volume and then used the "generateOptimizedXrayProjections" function to produce DRR for both the anteroposterior (AP) and lateral projections.
1. To view the results from this process, please refer to lines 34-35 and line 53. When I run this simulation, I can see the DRR results.
2. However, when I used a real CT image (lines 38-39 and line 54), the generated DRR appeared completely dark.
My goal is to generate a DRR from a real CT image, such as CT_13.nii.gz.
I would greatly appreciate any insights or suggestions regarding this code.
Attached below are the MATLAB code (zip file) for reference.
Thank you! Hello everyone,
I am simulating Orthogonal X-ray Projection, specifically Digitally Reconstructed Radiographs (DRR), from a particular CT volume.
To accomplish this, I first created a CT volume and then used the "generateOptimizedXrayProjections" function to produce DRR for both the anteroposterior (AP) and lateral projections.
1. To view the results from this process, please refer to lines 34-35 and line 53. When I run this simulation, I can see the DRR results.
2. However, when I used a real CT image (lines 38-39 and line 54), the generated DRR appeared completely dark.
My goal is to generate a DRR from a real CT image, such as CT_13.nii.gz.
I would greatly appreciate any insights or suggestions regarding this code.
Attached below are the MATLAB code (zip file) for reference.
Thank you! drr, digitally reconstructed radiographs, x-ray projection MATLAB Answers — New Questions
When i close a scope in simulink on my apple silicon the windows switches from simulink to matlab.
Whenever i try to close my scope in simulink, the window enters matlab instead of simulink where i originaly was. This causes me to switch back to simulink everytime i need to check results.Whenever i try to close my scope in simulink, the window enters matlab instead of simulink where i originaly was. This causes me to switch back to simulink everytime i need to check results. Whenever i try to close my scope in simulink, the window enters matlab instead of simulink where i originaly was. This causes me to switch back to simulink everytime i need to check results. simulink MATLAB Answers — New Questions
LaTex Font has changed since update
I want my font on my figues and tables to match the rest of what i am writing, so I ussually use the LaTex font in matlab when making figues.
In the start of the script I would write:
set(groot,’defaultAxesTickLabelInterpreter’,’latex’)
set(groot,’defaulttextinterpreter’,’latex’)
set(groot,’defaultLegendInterpreter’,’latex’)
However, since I hav updated my MatLab to R2023b, the font has changed.
I have attached eksample of how it looked before and after the update.
Granted symbols like and sub- and superscrpts still work as it ussually did.I want my font on my figues and tables to match the rest of what i am writing, so I ussually use the LaTex font in matlab when making figues.
In the start of the script I would write:
set(groot,’defaultAxesTickLabelInterpreter’,’latex’)
set(groot,’defaulttextinterpreter’,’latex’)
set(groot,’defaultLegendInterpreter’,’latex’)
However, since I hav updated my MatLab to R2023b, the font has changed.
I have attached eksample of how it looked before and after the update.
Granted symbols like and sub- and superscrpts still work as it ussually did. I want my font on my figues and tables to match the rest of what i am writing, so I ussually use the LaTex font in matlab when making figues.
In the start of the script I would write:
set(groot,’defaultAxesTickLabelInterpreter’,’latex’)
set(groot,’defaulttextinterpreter’,’latex’)
set(groot,’defaultLegendInterpreter’,’latex’)
However, since I hav updated my MatLab to R2023b, the font has changed.
I have attached eksample of how it looked before and after the update.
Granted symbols like and sub- and superscrpts still work as it ussually did. latex, font, r2023b MATLAB Answers — New Questions
Edges and Observed values of Chi2gof
I am trying to do a chi squared test on the means of this data which I have already sorted and is not the issue here. However, my observed values are just 4 ones even though I inputted the means I calculated. Does anyone know why this happens and how to solve it? Your help would be appreciated.
a=readmatrix("DIP Project- Population.xlsx");
population=a(:,1);
production=a(:,7);
gr1gen36=a(61:90,7);
gr1gen36(isnan(gr1gen36))=0;
gr1gen36;
m1=mean(gr1gen36);
gr2gen36=a(151:180,7);
gr2gen36(isnan(gr2gen36))=0;
gr2gen36;
m2=mean(gr2gen36);
gr3gen36=a(241:270,7);
gr3gen36(isnan(gr3gen36))=0;
m3=mean(gr3gen36);
gr4gen36=a(331:360,7);
gr4gen36(isnan(gr4gen36))=0;
gr4gen36;
m4=mean(gr4gen36);
gen36=[m1,m2,m3,m4];
expected=mean(gen36);
ex=[expected,expected,expected,expected];
[h,p,tbl]=chi2gof(gen36,’Expected’,ex,’Alpha’,0.05)
tbl =
struct with fields:
chi2stat: 66.0168
df: 3
edges: [9.3667 13.5667 17.7667 21.9667 26.1667]
O: [1 1 1 1]
E: [18.4500 18.4500 18.4500 18.4500]I am trying to do a chi squared test on the means of this data which I have already sorted and is not the issue here. However, my observed values are just 4 ones even though I inputted the means I calculated. Does anyone know why this happens and how to solve it? Your help would be appreciated.
a=readmatrix("DIP Project- Population.xlsx");
population=a(:,1);
production=a(:,7);
gr1gen36=a(61:90,7);
gr1gen36(isnan(gr1gen36))=0;
gr1gen36;
m1=mean(gr1gen36);
gr2gen36=a(151:180,7);
gr2gen36(isnan(gr2gen36))=0;
gr2gen36;
m2=mean(gr2gen36);
gr3gen36=a(241:270,7);
gr3gen36(isnan(gr3gen36))=0;
m3=mean(gr3gen36);
gr4gen36=a(331:360,7);
gr4gen36(isnan(gr4gen36))=0;
gr4gen36;
m4=mean(gr4gen36);
gen36=[m1,m2,m3,m4];
expected=mean(gen36);
ex=[expected,expected,expected,expected];
[h,p,tbl]=chi2gof(gen36,’Expected’,ex,’Alpha’,0.05)
tbl =
struct with fields:
chi2stat: 66.0168
df: 3
edges: [9.3667 13.5667 17.7667 21.9667 26.1667]
O: [1 1 1 1]
E: [18.4500 18.4500 18.4500 18.4500] I am trying to do a chi squared test on the means of this data which I have already sorted and is not the issue here. However, my observed values are just 4 ones even though I inputted the means I calculated. Does anyone know why this happens and how to solve it? Your help would be appreciated.
a=readmatrix("DIP Project- Population.xlsx");
population=a(:,1);
production=a(:,7);
gr1gen36=a(61:90,7);
gr1gen36(isnan(gr1gen36))=0;
gr1gen36;
m1=mean(gr1gen36);
gr2gen36=a(151:180,7);
gr2gen36(isnan(gr2gen36))=0;
gr2gen36;
m2=mean(gr2gen36);
gr3gen36=a(241:270,7);
gr3gen36(isnan(gr3gen36))=0;
m3=mean(gr3gen36);
gr4gen36=a(331:360,7);
gr4gen36(isnan(gr4gen36))=0;
gr4gen36;
m4=mean(gr4gen36);
gen36=[m1,m2,m3,m4];
expected=mean(gen36);
ex=[expected,expected,expected,expected];
[h,p,tbl]=chi2gof(gen36,’Expected’,ex,’Alpha’,0.05)
tbl =
struct with fields:
chi2stat: 66.0168
df: 3
edges: [9.3667 13.5667 17.7667 21.9667 26.1667]
O: [1 1 1 1]
E: [18.4500 18.4500 18.4500 18.4500] statistics MATLAB Answers — New Questions
why can I only edit one script?
Somehow I have reset Matlab to that I can only edit one script at a time. Can you suggest what I am doing wrong? Thanks.Somehow I have reset Matlab to that I can only edit one script at a time. Can you suggest what I am doing wrong? Thanks. Somehow I have reset Matlab to that I can only edit one script at a time. Can you suggest what I am doing wrong? Thanks. editor MATLAB Answers — New Questions
Please help me to run this simple code
% Error
Array indices must be positive integers or logical values.
Error in Untitled2 (line 45)
kh=kf*((k1+2*kf-2*ph1(kf-k1))/(k1+2*kf+ph1*(kf-k1)));
% code
proj()
function sol = proj
clc; clf; clear;
rhof=997.1*10^-3;kf=0.613*10^5;cpf=4179*10^4;muf=10^-3*10;
alfaf=kf/(rhof*cpf);
bef=21*10^-5;
sigf=0.05*10^-8;
ky=muf/rhof;
%Titanium oxide
ph4=0.01;
rho4=4250*10^-3;
cp4=711*10^4;
k4=8.953*10^5;
sig4=2.6*10*10^-1;
%Ag
ph1=0.01;
rho1=10500*10^-3;
cp1=235*10^4;
k1=429*10^5;be1=21*10^-5;
sig1=0.74*10^-2;
%copper
ph2=0.01;
rho2=8933*10^-3;
cp2=385*10^4;
k2=400*10^5;
sig2=5.96*10^-1;
be2=1.67*10^-5;
%Alumina
ph3=0.01;
rho3=3970*10^-3;
cp3=765*10^4;
k3=40*10^5;
be3=0.85*10^-5;
sig3=3.5*10^-1;
%Relation of ternary hyprid
kh=kf*((k1+2*kf-2*ph1(kf-k1))/(k1+2*kf+ph1*(kf-k1)));
kh=kn*((k2+2*kn-2*ph2(kn-k2))/(k2+2*kn+ph2*(kn-k2)));
kt=kh*((k3+2*kh-2*ph3(kh-k3))/(k3+2*kh+ph3*(kh-k3)));
kT=kt*((k4+2*kt-2*ph4*(kt-k4))/(k4+2*kt+ph4*(kt-k4)));
muT= muf/((1-ph1)^2.5*(1-ph2)^2.5*(1-ph3)^2.5*(1-ph4)^2.5);
rhoT=rhof*((1-ph4)*((1-ph3)*((1-ph2)*((1-ph1)+ph1*((ph1*rho1*(1/rhof))))+(ph2*rho2*(1/rhof))))+(ph3*rho3*(1/rhof))+ph4*rho4*(1/rhof));
sign = sigf*(1+(3*(sigf-1)*ph1)/((sigf+2)-(sigf-1)*ph1));
sigh = sign*(1+(3*(sign-1)*ph2)/((sign+2)-(sign-1)*ph2));
sigt = sigh*(1+(3*(sigh-1)*ph3)/((sigh+2)-(sigh-1)*ph3));
sigT = sigt*(1+(3*(sigt-1)*ph4)/((sigt+2)-(sigt-1)*ph4));
%vt=rhot*cpt
VT=(rhof*cpf)*((1-ph4)*((1-ph3)*((1-ph2)*((1-ph1)+ph1*((ph1*cp1*(1/rhof*cpf))))+(ph2*cp2*(1/rhof*cpf))))+(ph3*cp3*(1/rhof*cpf))+ph4*cp4*(1/rhof*cpf));
%disp(‘vt’);disp(vt);
%vb=rho*betb
vT =(1-ph1)*((1-ph2)*((1-ph3)+ph3*((rho3*be3)/(rhof*bef)))+ph2*((rho2*be2)/(rhof*bef)))+(1-ph1)*ph1*((rho1*be1)/(rhof*bef));
myLegend1 = {};myLegend2 = {};
rr = [0.1 0.3 0.5 0.7]
for i =1:numel(rr)
Rd= rr(i)
M=0.5;
R=1;Pr=6.9;
m = linspace(0,1);
y0 = [0,1,0,1,0,0,0,0];options =bvpset(‘stats’,’on’,’RelTol’,1e-5);
solinit = bvpinit(m,y0);
sol= bvp4c(@projfun,@projbc,solinit,options);
figure(1)
plot(sol.x,(sol.y(1,:)))
grid on,hold on
myLegend1{i}=[‘n= ‘,num2str(rr(i))];
figure(2)
plot(sol.x,(sol.y(7,:)))
grid on,hold on
myLegend2{i}=[‘n= ‘,num2str(rr(i))];
i=i+1;
end
figure(1)
legend(myLegend1)
hold on
figure(2)
legend(myLegend2)
hold on
function dy = projfun(x, y)
dy= zeros(8,1);
% alignComments
f = y(1);
df = y(2);
g = y(3);
dg= y(4);
h= y(5);
dh = y(6);
t = y(7);
dt=y(8);
dy(1) = df;
dy(2) =(1/(1+x^2))*(3*x*df+R*((muT/muf))*(f^2-f*df+h*df-g^2+(sigT/sigf)*M*f));
dy(3) = dg;
dy(4) = (1/(1+x^2))*(3*x*dg+R*((muT/muf))*(2*f*g-f*dg+h*dg+(sigT/sigf)*M*g));
dy(5) =dh ;
dy(6) =(1/(1+x^2))*(2*x*dh-h+R*((muT/muf))*(f*dh-h*dh-f*h));
dy(7) =dt;
dy(8)=(1/(1+x^2+(4/3)*Rd*(1/(kT/kf))))*(((x-4)*dt)-4*t-Pr*R*((vT/(rhof*cpf))*(kf/kT))*(x*f*dt-2*f*t-h*dt));
end
end
function res= projbc(ya,yb)
res= [ya(1)-0.1;
ya(3)-1;
ya(5)-0.1;
ya(7)-1;
yb(1)-0.1;
yb(3);
yb(5);
yb(7);
];
end% Error
Array indices must be positive integers or logical values.
Error in Untitled2 (line 45)
kh=kf*((k1+2*kf-2*ph1(kf-k1))/(k1+2*kf+ph1*(kf-k1)));
% code
proj()
function sol = proj
clc; clf; clear;
rhof=997.1*10^-3;kf=0.613*10^5;cpf=4179*10^4;muf=10^-3*10;
alfaf=kf/(rhof*cpf);
bef=21*10^-5;
sigf=0.05*10^-8;
ky=muf/rhof;
%Titanium oxide
ph4=0.01;
rho4=4250*10^-3;
cp4=711*10^4;
k4=8.953*10^5;
sig4=2.6*10*10^-1;
%Ag
ph1=0.01;
rho1=10500*10^-3;
cp1=235*10^4;
k1=429*10^5;be1=21*10^-5;
sig1=0.74*10^-2;
%copper
ph2=0.01;
rho2=8933*10^-3;
cp2=385*10^4;
k2=400*10^5;
sig2=5.96*10^-1;
be2=1.67*10^-5;
%Alumina
ph3=0.01;
rho3=3970*10^-3;
cp3=765*10^4;
k3=40*10^5;
be3=0.85*10^-5;
sig3=3.5*10^-1;
%Relation of ternary hyprid
kh=kf*((k1+2*kf-2*ph1(kf-k1))/(k1+2*kf+ph1*(kf-k1)));
kh=kn*((k2+2*kn-2*ph2(kn-k2))/(k2+2*kn+ph2*(kn-k2)));
kt=kh*((k3+2*kh-2*ph3(kh-k3))/(k3+2*kh+ph3*(kh-k3)));
kT=kt*((k4+2*kt-2*ph4*(kt-k4))/(k4+2*kt+ph4*(kt-k4)));
muT= muf/((1-ph1)^2.5*(1-ph2)^2.5*(1-ph3)^2.5*(1-ph4)^2.5);
rhoT=rhof*((1-ph4)*((1-ph3)*((1-ph2)*((1-ph1)+ph1*((ph1*rho1*(1/rhof))))+(ph2*rho2*(1/rhof))))+(ph3*rho3*(1/rhof))+ph4*rho4*(1/rhof));
sign = sigf*(1+(3*(sigf-1)*ph1)/((sigf+2)-(sigf-1)*ph1));
sigh = sign*(1+(3*(sign-1)*ph2)/((sign+2)-(sign-1)*ph2));
sigt = sigh*(1+(3*(sigh-1)*ph3)/((sigh+2)-(sigh-1)*ph3));
sigT = sigt*(1+(3*(sigt-1)*ph4)/((sigt+2)-(sigt-1)*ph4));
%vt=rhot*cpt
VT=(rhof*cpf)*((1-ph4)*((1-ph3)*((1-ph2)*((1-ph1)+ph1*((ph1*cp1*(1/rhof*cpf))))+(ph2*cp2*(1/rhof*cpf))))+(ph3*cp3*(1/rhof*cpf))+ph4*cp4*(1/rhof*cpf));
%disp(‘vt’);disp(vt);
%vb=rho*betb
vT =(1-ph1)*((1-ph2)*((1-ph3)+ph3*((rho3*be3)/(rhof*bef)))+ph2*((rho2*be2)/(rhof*bef)))+(1-ph1)*ph1*((rho1*be1)/(rhof*bef));
myLegend1 = {};myLegend2 = {};
rr = [0.1 0.3 0.5 0.7]
for i =1:numel(rr)
Rd= rr(i)
M=0.5;
R=1;Pr=6.9;
m = linspace(0,1);
y0 = [0,1,0,1,0,0,0,0];options =bvpset(‘stats’,’on’,’RelTol’,1e-5);
solinit = bvpinit(m,y0);
sol= bvp4c(@projfun,@projbc,solinit,options);
figure(1)
plot(sol.x,(sol.y(1,:)))
grid on,hold on
myLegend1{i}=[‘n= ‘,num2str(rr(i))];
figure(2)
plot(sol.x,(sol.y(7,:)))
grid on,hold on
myLegend2{i}=[‘n= ‘,num2str(rr(i))];
i=i+1;
end
figure(1)
legend(myLegend1)
hold on
figure(2)
legend(myLegend2)
hold on
function dy = projfun(x, y)
dy= zeros(8,1);
% alignComments
f = y(1);
df = y(2);
g = y(3);
dg= y(4);
h= y(5);
dh = y(6);
t = y(7);
dt=y(8);
dy(1) = df;
dy(2) =(1/(1+x^2))*(3*x*df+R*((muT/muf))*(f^2-f*df+h*df-g^2+(sigT/sigf)*M*f));
dy(3) = dg;
dy(4) = (1/(1+x^2))*(3*x*dg+R*((muT/muf))*(2*f*g-f*dg+h*dg+(sigT/sigf)*M*g));
dy(5) =dh ;
dy(6) =(1/(1+x^2))*(2*x*dh-h+R*((muT/muf))*(f*dh-h*dh-f*h));
dy(7) =dt;
dy(8)=(1/(1+x^2+(4/3)*Rd*(1/(kT/kf))))*(((x-4)*dt)-4*t-Pr*R*((vT/(rhof*cpf))*(kf/kT))*(x*f*dt-2*f*t-h*dt));
end
end
function res= projbc(ya,yb)
res= [ya(1)-0.1;
ya(3)-1;
ya(5)-0.1;
ya(7)-1;
yb(1)-0.1;
yb(3);
yb(5);
yb(7);
];
end % Error
Array indices must be positive integers or logical values.
Error in Untitled2 (line 45)
kh=kf*((k1+2*kf-2*ph1(kf-k1))/(k1+2*kf+ph1*(kf-k1)));
% code
proj()
function sol = proj
clc; clf; clear;
rhof=997.1*10^-3;kf=0.613*10^5;cpf=4179*10^4;muf=10^-3*10;
alfaf=kf/(rhof*cpf);
bef=21*10^-5;
sigf=0.05*10^-8;
ky=muf/rhof;
%Titanium oxide
ph4=0.01;
rho4=4250*10^-3;
cp4=711*10^4;
k4=8.953*10^5;
sig4=2.6*10*10^-1;
%Ag
ph1=0.01;
rho1=10500*10^-3;
cp1=235*10^4;
k1=429*10^5;be1=21*10^-5;
sig1=0.74*10^-2;
%copper
ph2=0.01;
rho2=8933*10^-3;
cp2=385*10^4;
k2=400*10^5;
sig2=5.96*10^-1;
be2=1.67*10^-5;
%Alumina
ph3=0.01;
rho3=3970*10^-3;
cp3=765*10^4;
k3=40*10^5;
be3=0.85*10^-5;
sig3=3.5*10^-1;
%Relation of ternary hyprid
kh=kf*((k1+2*kf-2*ph1(kf-k1))/(k1+2*kf+ph1*(kf-k1)));
kh=kn*((k2+2*kn-2*ph2(kn-k2))/(k2+2*kn+ph2*(kn-k2)));
kt=kh*((k3+2*kh-2*ph3(kh-k3))/(k3+2*kh+ph3*(kh-k3)));
kT=kt*((k4+2*kt-2*ph4*(kt-k4))/(k4+2*kt+ph4*(kt-k4)));
muT= muf/((1-ph1)^2.5*(1-ph2)^2.5*(1-ph3)^2.5*(1-ph4)^2.5);
rhoT=rhof*((1-ph4)*((1-ph3)*((1-ph2)*((1-ph1)+ph1*((ph1*rho1*(1/rhof))))+(ph2*rho2*(1/rhof))))+(ph3*rho3*(1/rhof))+ph4*rho4*(1/rhof));
sign = sigf*(1+(3*(sigf-1)*ph1)/((sigf+2)-(sigf-1)*ph1));
sigh = sign*(1+(3*(sign-1)*ph2)/((sign+2)-(sign-1)*ph2));
sigt = sigh*(1+(3*(sigh-1)*ph3)/((sigh+2)-(sigh-1)*ph3));
sigT = sigt*(1+(3*(sigt-1)*ph4)/((sigt+2)-(sigt-1)*ph4));
%vt=rhot*cpt
VT=(rhof*cpf)*((1-ph4)*((1-ph3)*((1-ph2)*((1-ph1)+ph1*((ph1*cp1*(1/rhof*cpf))))+(ph2*cp2*(1/rhof*cpf))))+(ph3*cp3*(1/rhof*cpf))+ph4*cp4*(1/rhof*cpf));
%disp(‘vt’);disp(vt);
%vb=rho*betb
vT =(1-ph1)*((1-ph2)*((1-ph3)+ph3*((rho3*be3)/(rhof*bef)))+ph2*((rho2*be2)/(rhof*bef)))+(1-ph1)*ph1*((rho1*be1)/(rhof*bef));
myLegend1 = {};myLegend2 = {};
rr = [0.1 0.3 0.5 0.7]
for i =1:numel(rr)
Rd= rr(i)
M=0.5;
R=1;Pr=6.9;
m = linspace(0,1);
y0 = [0,1,0,1,0,0,0,0];options =bvpset(‘stats’,’on’,’RelTol’,1e-5);
solinit = bvpinit(m,y0);
sol= bvp4c(@projfun,@projbc,solinit,options);
figure(1)
plot(sol.x,(sol.y(1,:)))
grid on,hold on
myLegend1{i}=[‘n= ‘,num2str(rr(i))];
figure(2)
plot(sol.x,(sol.y(7,:)))
grid on,hold on
myLegend2{i}=[‘n= ‘,num2str(rr(i))];
i=i+1;
end
figure(1)
legend(myLegend1)
hold on
figure(2)
legend(myLegend2)
hold on
function dy = projfun(x, y)
dy= zeros(8,1);
% alignComments
f = y(1);
df = y(2);
g = y(3);
dg= y(4);
h= y(5);
dh = y(6);
t = y(7);
dt=y(8);
dy(1) = df;
dy(2) =(1/(1+x^2))*(3*x*df+R*((muT/muf))*(f^2-f*df+h*df-g^2+(sigT/sigf)*M*f));
dy(3) = dg;
dy(4) = (1/(1+x^2))*(3*x*dg+R*((muT/muf))*(2*f*g-f*dg+h*dg+(sigT/sigf)*M*g));
dy(5) =dh ;
dy(6) =(1/(1+x^2))*(2*x*dh-h+R*((muT/muf))*(f*dh-h*dh-f*h));
dy(7) =dt;
dy(8)=(1/(1+x^2+(4/3)*Rd*(1/(kT/kf))))*(((x-4)*dt)-4*t-Pr*R*((vT/(rhof*cpf))*(kf/kT))*(x*f*dt-2*f*t-h*dt));
end
end
function res= projbc(ya,yb)
res= [ya(1)-0.1;
ya(3)-1;
ya(5)-0.1;
ya(7)-1;
yb(1)-0.1;
yb(3);
yb(5);
yb(7);
];
end pvp4c MATLAB Answers — New Questions
Why does joint PID tracking in a Simscape Multibody leg model degrade when Spatial Contact Force is enabled, while it works well without ground contact (XZ plane)?
I am simulating a simplified lower-limb / prosthetic leg in Simscape Multibody with 3 revolute joints (hip, knee, ankle). The motion is intended to be planar in the sagittal plane (XZ).What I am doing
I provide reference joint trajectories for hip/knee/ankle from a gait dataset (10 concatenated gait cycles) using three timeseries signals:
hip_ts, knee_ts, ankle_ts
Each joint is controlled by a joint-level PID/PD block that outputs a torque
The measured joint angles q are taken from the joint sensors and fed back to the controller (scopes show reference vs simulated for each joint).
What works (no contact)
If I disable ground contact, the joint tracking is reasonably good for all joints (hip/knee/ankle). The simulated angles follow the reference signals with small error.
The problem (with contact enabled)
When I enable foot–ground contact using Spatial Contact Force (foot geometry vs ground plane), the tracking becomes much worse:
large tracking errors / oscillations appear
the behavior looks unstable or heavily disturbed during stance/contact phases
the same PID gains that work without contact no longer work
What I suspect / questions
I am trying to understand what is causing this degradation when contact is enabled:
Is this mainly due to the contact model parameters (stiffness, damping, friction) creating stiff dynamics that destabilize the joint PID?
Could the issue be caused by unintended extra DOFs at the hip/base (e.g., the hip not fully constrained in the plane), so contact forces introduce out-of-plane motion or additional dynamics?
Is it conceptually wrong to expect simple joint PID tracking to work well when contact forces are present, and should I instead use:
impedance control at the joints,
inverse dynamics / computed torque,
or a constraint-based approach for stance?
What I can provide
Screenshot of the Simulink/Simscape model (joint controllers + Spatial Contact Force block)
Scope screenshots showing reference vs actual joint angles for hip/knee/ankle
Contact block settings (stiffness/damping/friction) and solver settings if needed
Question: What are the most common reasons why enabling Spatial Contact Force makes joint-level PID tracking degrade dramatically in Simscape Multibody, and what specific checks/changes would you recommend (contact parameters, solver, constraints/DOFs at hip/base, control structure)?I am simulating a simplified lower-limb / prosthetic leg in Simscape Multibody with 3 revolute joints (hip, knee, ankle). The motion is intended to be planar in the sagittal plane (XZ).What I am doing
I provide reference joint trajectories for hip/knee/ankle from a gait dataset (10 concatenated gait cycles) using three timeseries signals:
hip_ts, knee_ts, ankle_ts
Each joint is controlled by a joint-level PID/PD block that outputs a torque
The measured joint angles q are taken from the joint sensors and fed back to the controller (scopes show reference vs simulated for each joint).
What works (no contact)
If I disable ground contact, the joint tracking is reasonably good for all joints (hip/knee/ankle). The simulated angles follow the reference signals with small error.
The problem (with contact enabled)
When I enable foot–ground contact using Spatial Contact Force (foot geometry vs ground plane), the tracking becomes much worse:
large tracking errors / oscillations appear
the behavior looks unstable or heavily disturbed during stance/contact phases
the same PID gains that work without contact no longer work
What I suspect / questions
I am trying to understand what is causing this degradation when contact is enabled:
Is this mainly due to the contact model parameters (stiffness, damping, friction) creating stiff dynamics that destabilize the joint PID?
Could the issue be caused by unintended extra DOFs at the hip/base (e.g., the hip not fully constrained in the plane), so contact forces introduce out-of-plane motion or additional dynamics?
Is it conceptually wrong to expect simple joint PID tracking to work well when contact forces are present, and should I instead use:
impedance control at the joints,
inverse dynamics / computed torque,
or a constraint-based approach for stance?
What I can provide
Screenshot of the Simulink/Simscape model (joint controllers + Spatial Contact Force block)
Scope screenshots showing reference vs actual joint angles for hip/knee/ankle
Contact block settings (stiffness/damping/friction) and solver settings if needed
Question: What are the most common reasons why enabling Spatial Contact Force makes joint-level PID tracking degrade dramatically in Simscape Multibody, and what specific checks/changes would you recommend (contact parameters, solver, constraints/DOFs at hip/base, control structure)? I am simulating a simplified lower-limb / prosthetic leg in Simscape Multibody with 3 revolute joints (hip, knee, ankle). The motion is intended to be planar in the sagittal plane (XZ).What I am doing
I provide reference joint trajectories for hip/knee/ankle from a gait dataset (10 concatenated gait cycles) using three timeseries signals:
hip_ts, knee_ts, ankle_ts
Each joint is controlled by a joint-level PID/PD block that outputs a torque
The measured joint angles q are taken from the joint sensors and fed back to the controller (scopes show reference vs simulated for each joint).
What works (no contact)
If I disable ground contact, the joint tracking is reasonably good for all joints (hip/knee/ankle). The simulated angles follow the reference signals with small error.
The problem (with contact enabled)
When I enable foot–ground contact using Spatial Contact Force (foot geometry vs ground plane), the tracking becomes much worse:
large tracking errors / oscillations appear
the behavior looks unstable or heavily disturbed during stance/contact phases
the same PID gains that work without contact no longer work
What I suspect / questions
I am trying to understand what is causing this degradation when contact is enabled:
Is this mainly due to the contact model parameters (stiffness, damping, friction) creating stiff dynamics that destabilize the joint PID?
Could the issue be caused by unintended extra DOFs at the hip/base (e.g., the hip not fully constrained in the plane), so contact forces introduce out-of-plane motion or additional dynamics?
Is it conceptually wrong to expect simple joint PID tracking to work well when contact forces are present, and should I instead use:
impedance control at the joints,
inverse dynamics / computed torque,
or a constraint-based approach for stance?
What I can provide
Screenshot of the Simulink/Simscape model (joint controllers + Spatial Contact Force block)
Scope screenshots showing reference vs actual joint angles for hip/knee/ankle
Contact block settings (stiffness/damping/friction) and solver settings if needed
Question: What are the most common reasons why enabling Spatial Contact Force makes joint-level PID tracking degrade dramatically in Simscape Multibody, and what specific checks/changes would you recommend (contact parameters, solver, constraints/DOFs at hip/base, control structure)? simulink, simscape, control MATLAB Answers — New Questions









