Solve a cubic equation using MATLAB code
이전 댓글 표시
I have a cubic equation whose coefficients are varying according to a parameter say w in the following manner:
a=2/w;
b=(3/w+3);
c=(4/(w-9))^3;
d=(5/(w+6))^2;
a*(x^3)+b*(x^2)+c*x+d=0
I want to solve the above equation using a m-file not in the command window. Is it possible ? I am fairly new to MATLAB, so help would be appreciated.
채택된 답변
추가 답변 (4개)
Bruno Luong
2011년 2월 26일
편집: Image Analyst
2018년 11월 16일
Please download this FEX,
w = linspace(-3,3,10);
a = 2./w;
b = (3./w+3);
c = (4./(w-9)).^3;
d = (5./(w+6)).^2;
X = CardanRoots([a(:) b(:) c(:) d(:)])
Each row of X contains three solutions of the respective cubic equation. Filter out the complex solutions if you don't need them.
댓글 수: 3
Ann Ytterberg
2018년 11월 16일
Where is this CardonRoots.m?
Image Analyst
2018년 11월 16일
It's the first hit from Google: CardanRoots
Bruno Luong
2018년 11월 16일
Click on the link it should work
Walter Roberson
2011년 2월 26일
EDIT: corrected missing syms, added more detail
function sols = solve_cubic(a, b, c, d)
syms x
sols = solve(a*x^3 + b*x^2 + c*x + d);
end
The inputs to this can include symbolic expressions.
The outputs of this will be symbolic numeric radicals if the inputs are all numeric, but might include symbolic RootOf expressions if any of the arguments are symbolic. To convert symbolic numbers to double precision floating point numbers, use double() on the output.
댓글 수: 5
Bhagat
2011년 2월 26일
편집: Walter Roberson
2020년 9월 13일
Bhagat
2011년 2월 26일
Walter Roberson
2011년 2월 26일
Sorry I missed a statement before.
Walter Roberson
2011년 2월 26일
Don't use the apostrophes, use the syms command.
Bhagat
2011년 2월 26일
Walter Roberson
2011년 2월 26일
Provided that the input values are scalar numeric:
function sols = solve_cubic(a, b, c, d)
sols = roots([a,b,c,d]);
end
EDIT: provide more detail
The solutions to this will be a column vector of double precision floating point numbers (possibly complex.)
댓글 수: 13
Bhagat
2011년 2월 26일
Walter Roberson
2011년 2월 26일
편집: Walter Roberson
2020년 9월 13일
Wvals = 1:exp(1):pi^3; %chose appropriate vals
nW = length(Wvals);
out1 = nan(1,nW);
out2 = nan(1,nW);
out3 = nan(1,nW);
for K = 1 : nW
w = Wvals(K);
a=2/w; b=(3/w+3); c=(4/(w-9))^3; d=(5/(w+6))^2;
these_sols = solve_cubic(a,b,c,d);
these_sols = these_sols(imag(these_sols) == 0);
L = length(these_sols);
if L > 0
out1(K) = these_sols(1);
end
if L > 1
out2(K) = these_sols(2);
end
if L > 2
out3(K) = these_sols(3);
end
end
plot(Wvals, out1, '.', Wvals, out2, '.', Wvals, out3, '.');
This will plot up to 3 points per w value, as there can be up to 3 real solutions in general. (I would have to look further to see whether 3 real solutions are actually possible.)
Walter Roberson
2011년 2월 26일
There is an algebraic theorem that any cubic in real coefficients has either one or three real roots, never 0 or 2. You can use that theorem to simplify the above code slightly.
I tried some values myself, and found that indeed for most values of w, there is only one real root. There is a region, though, that is somewhere within -10 to +10, in which there are 3 real roots for each value of w.
Bhagat
2011년 2월 26일
Walter Roberson
2011년 2월 26일
find(Matrix < ParticularNumber)
Bhagat
2011년 2월 28일
Bhagat
2011년 2월 28일
Walter Roberson
2011년 2월 28일
Matrix(Matrix < ParticularNumber)
Bhagat
2011년 2월 28일
Bhagat
2011년 2월 28일
편집: Walter Roberson
2020년 9월 13일
Bhagat
2011년 2월 28일
Walter Roberson
2011년 2월 28일
편집: Walter Roberson
2020년 9월 13일
You _are_ putting in w as a constant value: it's value is the entire list 10:2:30 . Using a list like that is not varying w.
Although it is possible to slightly change your a, b, c, and d so that values for each of the w would be calculated, the roots() call will not accept a vector of values, and must be called for each individual a, b, c, d combination.
w0 = 10:2:30;
for K = 1 : length(w0)
w = w0(K);
%calculate a, b, c, d here, and calculate the roots and select those in the proper range and continue on through to the calculation of "l". Do _not_ do the plot() at this time though.
L{K} = l;
end
Now you can plot of w0(K) against L{K}, but keep in mind that you might have no real roots or one real root or three real roots for any individual w, so you will have to build appropriate plotting code.
Bhagat
2011년 3월 1일
Awa Kologo
2020년 9월 13일
0 개 추천
- Solving for the roots of a third order polynomial (i.e. finding a value that will make the expression equal zero) may require tedious algebra to do by hand but can be solved easily by a computer using an iterative approach. For example, finding the roots of the expression: , (ie. a value of x so that the equation is satisfied) is time consuming to do by hand. However, plugging in a guess for and then modifying that guess until a tolerance is met gives . Write a MATLAB script that solves exponential equations of the form where are constants that the user inputs in a 1 x 4 row vector: [a b c d]. The program will first check whether or not the input is a 1 x 4 matrix of numerical entries throw an error if it is not. The program will solve for one root of the polynomial iteratively to 6 decimal places and print out the value. You can take this to mean that your program should keep running for as long as Your program will need to make an initial guess for in order to solve iteratively. In most cases, the will give a reasonable first guess. You can use the roots() function to check your answer.
댓글 수: 1
Walter Roberson
2020년 9월 13일
This does not appear to be an Answer to the Question that was asked.
카테고리
도움말 센터 및 File Exchange에서 Common Operations에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!