Solving equations and plotting the results [closed] - matlab

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago.
Improve this question
(edited, i have changed the code) Well i have compound equations that i need to solve in matlab and find the result.
I have tried different techniques but have failed.
the equations are:
u(j-1)-2(u(j))+u(j+1)= -4*h^2*pi^2 * sin(2*pi*xj)
where
n=100
j=1 to n
xj=jh
h=1/n
u(0)==u(n)==0
I need to solve the equation and plot the results. so that i can compare the results with
the exact solution.
This is the code i have written so far...
function c= prob1()
n=100;
c=(0); % variable to store all results
u = linspace(1,n-1);
for k=3:90
jay=k;
h=1/k;
syms xj
eqn6 = u(jay-1) -2*u(jay)+u(jay+1)==-4*(h^2)*(pi^2)*sin(2*pi*xj);
A = solve(eqn6, xj); % solving the equation with xj as unknown
if(~(A==0))
c=vertcat(c,A); % just filtering out the results with 0 output
end
end
end
Now i GET answers in A like this " (625*asin(1/9877545463176224))/3927 ".
which i cannot plot.

Setting up the system of equations Au = b is done by translation the math into MATLAB language as follows:
n = 100;
h = 1/n;
j = 0:n; % include zero for the boundary condition
xj = j*h;
% set up right hand side
b = (-4*h^2*pi^2*sin(2*pi*xj))';
% overwrite the first and last value of b with the right hand side of the boundary conditions:
b([1 end]) = 0;
% This is the interesting part:
% set up A: 1*u(j-1) -2*u(j) + 1*u(j+1) and include the boundary conditions
main = [1; -2*ones(n-1,1); 1];
upper = [0; ones(n-1,1)];
lower = [ones(n-1,1); 0];
A = gallery('tridiag', lower, main, upper);
If you dont see why this works, I would suggest to write out the equations for at least j = 0, n/2 and n based on A and b, and to compare them with your equations.
Now, we are ready to solve the system. The system is small so I use the backslash operator (which is a direct method), but you could also pick iterative methods like bicgstab, gmres, qmr:
u = A\b;
Plot the resulting u:
plot(xj,u)

Related

How to discretize a nonlinear system [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 1 year ago.
Improve this question
How can i discretize the following nonlinear system. Im using Matlab and Casadi for Model Predictive Control. The Constant C is betwenn 0 and 1.
dx/dt = C * x/(x^2 + 1)
Thank you for your time and Help.
If you are just looking to build it from blocks, something like this should work:
You basically need to invert the formula to:
x = int(C * x/(x^2 + 1))
Everything to the right of the equal sign then feeds the input to the integrator and the output of the integrator becomes x.
Well if you want to use the file to discretize a differential equation, there are a lot of methods such as simple Euler, Runge-Kutta, and so on. Let me say how to use the Euler method. based on the differential definition:
dx/dt = (x(i+1) - x(i))/dt
here i is the discretization index and dt is sample time (typically 0.01). If I have to use your equation:
(x(i+1) - x(i))/dt = C*x(i)/(x(i)^2 + 1)
after simplification:
x(i+1) = x(i) + dt*(C*x(i)/(x(i)^2 + 1))
this is your discretized model. In matlab, just use the following code:
C = 0.5;
N = 100;
x(1) = 1; % initial condition
dt = 0.01;
i = 1;
for i = 1:N
x(i+1) = x(i) + dt*(C*x(i)/(x(i)^2 + 1));
end

Code for iterative function [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 5 years ago.
Improve this question
I'd like to write the Matlab code for the following equation:
z(k)=lamda*x(k)+(1-lamda)*z(k-1)
lamda can be of any value. x is a 1000x22 matrix. Z(0)=0.
Can anyone help me please?
You can use iteration function.same thing like this
function z = itrationFunctio(k,x,lambda)
if(k == 0)
z = 0;
else
z = lambda*x+(1-lambda)*itrationFunctio((k-1),x,lambda);
end
and in your code just call itrationFunctio(k,x,lambda).
Does that vectorized solution work for you?
% parameters
x = rand(10,1);
lambda = 2;
% init z, normalize with (1-lambda)
z(2:numel(x)) = lambda/(1-lambda)*x(2:end);
% cumsum, denormalize with (1-lambda)
z = cumsum(z)*(1-lambda)
However I don't get why your x is a matrix and not a vector. What is z supposed to be, in what dimension works k? So in case xrepresents a couple of vectors you want to calculate in parallel, that could work:
% parameters
x = rand(1000,22);
lambda = 2;
% init z, normalize with (1-lambda)
z(2:size(x,1),:) = lambda/(1-lambda)*x(2:end,:);
% cumsum, denormalize with (1-lambda)
z = cumsum(z,1)*(1-lambda)

why this code is false? and when it is tried using different M&N it id right!? [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Questions asking for code must demonstrate a minimal understanding of the problem being solved. Include attempted solutions, why they didn't work, and the expected results. See also: Stack Overflow question checklist
Closed 9 years ago.
Improve this question
for X = 0: 0.00001 : 100;
M=(((sqrt(2*X)-(1/3))^2)*(2*X-1));
N=(( 10.99743/sqrt(X)-(23/30))^2)*(( 53.75263/X)-1);
if M == N
Y=X;
end
end
this code is for an equation with two sides M&N,,, it must be solved using try and error or Matlab Numerical
why this code is false?
Your problem is (as nkjt points out) with comparing floating point values with ==.
FYI: If your objective is to find for which X, M == N, then you could do it much simpler using for instance fzero:
f = #(X) (((sqrt(2.*X)-(1/3))^2)*(2.*X-1))- ...
(( 10.99743./sqrt(X)-(23/30))^2)*(( 53.75263./X)-1);
y = fsolve(f,1)
y = 6.0304
This gives:
M - N = -1.3743e-05
Which is quite close to zero (as close as you will get).
If you absolutely want try and fail, see if you can decipher this (based on the idea of nkjt):
step = 1;
X = 1:step:100
M=(((sqrt(2*X)-(1/3)).^2).*(2*X-1));
N=(( 10.99743./sqrt(X)-(23/30)).^2).*(( 53.75263./X)-1);
[Y, idx] = min(abs(N-M))
err = 1e-10; % Arbitrary tolerance > 1e-14 (typically)
it = 0;
while Y > err && it < 10
step = step / 10;
it = it + 1;
X = X(idx) + (-step*10:step:step*10);
M=(((sqrt(2*X)-(1/3)).^2).*(2*X-1));
N=(( 10.99743./sqrt(X)-(23/30)).^2).*(( 53.75263./X)-1);
[Y, idx] = min(abs(N-M))
end
The perils of floating point comparison could be one factor. When comparing two floating point numbers, you should not use == but check if the difference between them is less than some tolerance (can use eps or something else, depending on your requirements).
Rather than looping at very small steps across your entire range of possible values, you can vectorise, start with a coarser range of X values and get a much better idea of where your solution probably lies, for example:
X = 0:1:100
M=(((sqrt(2*X)-(1/3)).^2).*(2*X-1));
N=(( 10.99743./sqrt(X)-(23/30)).^2).*(( 53.75263./X)-1);
Y = abs(M-N);
plot(X,Y);
Then find the minimum difference between M and N, reduce your step size and range, and continue until you get to a value for X for which the value of abs(M-N) is below your tolerance (required accuracy of your solution).

matlab: To find the multiplier which reduces the standard deviation between two series [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Questions asking for code must demonstrate a minimal understanding of the problem being solved. Include attempted solutions, why they didn't work, and the expected results. See also: Stack Overflow question checklist
Closed 9 years ago.
Improve this question
i want to find the value of C such that standard deviation of A-B*C is minimum using matlab (A & B are vectors) where as C would be a scalar. Any ideas ?
This isn't a programming problem, it's a math problem. You want to find c such that
Var(A - c * B)
is minimized. But
Var(A - c*B) = Var(A) - 2 * c * Cov(A,B) + c^2 * Var(B)
Differentiating and setting to zero
-2 * Cov(A,B) + 2 * c * Var(B) = 0
which implies
c = Cov(A,B) / Var(B)
You can achieve this in Matlab with
M = cov(A, B); # Now M = [varA, covAB; covAB, varB]
covAB = M(1,2);
varB = M(2,2);
c = covAB / varB;
Following #EitanT's advice, try:
Ctry = 1.5; % define trial parameter first
Copt = fminsearch(#(x) sum((A-B*x).^2),Ctry)
edit
Note that in the above I assumed you wanted to minimize the vector norm, but following commentaries it is evident that you want to minimize the std dev of samples in array (A-B*x), in which case try
Ctry = 1.5; % define trial parameter first
Copt = fminsearch(#(x) var(A-B*x),Ctry)
If you are performing columnwise substraction of vector B from A, you can do as follows:
A=rand(900,100); B=randn(900,1); % example
Ctry = 1.5; % define parameter first
B = repmat(B,size(A,2),1);
Copt = fminsearch(#(x) var(A(:)-B*x),Ctry)
Eopt=var(A(:)-B*Copt)
#Luis Mendo suggests
nA = numel(A);
Copt = fminsearch(#(x) sum((A(:)-B*x).^2)-sum(A(:)-B*x)^2/nA,Ctry)
This is a little faster on my system.
Also, as with all minimization problems, it helps if you have a good starting estimate.
Edit
It's worth noting that the two methods find points that differ in the second significant figure, which raises the question which is more accurate. <-- just an issue that can be fixed with optimset

unable to solve the following equations in MATLAB [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago.
Improve this question
Following is a part of a code I am writing in matlab, here I want to carry out the following simple mathematical operation [A][X]=[B], where [X] is unknown. In my case I have length of k around 1600000. So all I want is to get the values for g1,g2 and g3 for each element on the array. I have tried the following
k31 = omega3./(d)
k32 = omega3_2./(d)
A = [2,1,5;-2,-1,-5];
X = [g1;g2;g3];
for ii = 1:length(k31)
B = [k31(ii); k32(ii)];
X = pinv(A).*B;
end
display(g1,g2,g3)
I am using pseudo-inverse so basically I can get a solution for each X and I have made some edit there....and x is unknown, MATHEMATICALLY it can be done, but am not able to code it
Also how do I plot the values of g1 g2 g3 with x and y as follows scatter(x(1:end-1), y(1:end-1), 5, g1); scatter(x(1:end-1), y(1:end-1), 5, g2) and scatter(x(1:end-1), y(1:end-1), 5, g3)
I have to make a few assumptions here, so bear with me.
I suspect you want to do this:
k31 = omega3./(d)
k32 = omega3_2./(d)
A = [2,1,5;-2,-1,-5];
X = cell(length(k31),1);
for ii = 1:length(k31)
X{ii} = A\[k31(ii); k32(ii)];
end
which uses the backslash operator instead of inv or pinv. Type help slash to get more information.
The backslash operator will usually be much faster and more accurate than inv or pinv. It is also a lot more flexible -- your case is underdetermined (you are 1 equation short of being able to solve explicitly), in which case the backslash operator will find you a least-squares solution.
Note how I save all results in a cell-array X. This means that the nth solution will be accessible via
X{n} % == [g1(n) g2(n) g3(n)]
In my opinion you are better off creating a pseudo inverse from the singular value decomposition. Moore-Penrose pseudo inverse will work, but I think it gives some weird results sometimes. The least squares can be unstable, especially since the rank of your example matrix is not full.
Also; don't calculate the inverse for every iteration!
Here is an example, where rank-deficiency of A is taken care of:
A = [2,1,5;-2,-1,-5];
% pseudo inverse of A
[m,n] = size(A);
% get SVD
[U,S,V] = svd(A);
% check rank
r = rank(S);
SR = S(1:r,1:r);
% make complete if rank is not full
SRc = [SR^-1 zeros(r,m-r);zeros(n-r,r) zeros(n-r,m-r)];
% create inverse
A_inv = V*SRc*U.';
X=[];
for i = 1:1600
% this actually takes most of the time
k31 = rand(1000, 1);
k32 = rand(1000, 1);
B = [k31';k32'];
% X is overwritten on every loop...
X = [X A_inv*B];
end
N_xy = 1000;
x = rand(N_xy,1);
y = rand(N_xy,1);
g1 = X(1,1:N_xy);
figure(1), clf
scatter(x,y,5,g1)
I didn't plot all 1600000 points since that can't be what you want