Problem in using solve to find a solution to four equations !!!
3 次查看(过去 30 天)
显示 更早的评论
Hello,
Below is the code to solve for x1,x2,x3,x4 with four equations. The other terms appearing in the equations are constants and are calculated in the same code. I tried this with fsolve, and I am able to get solutions, but when trying with solve, I am getting this error ¨ Attempt to execute SCRIPT solve as a function:¨.The code is given below,
N=16;
v1a=0.15928512;
v3a=-0.11500684;
v1d=0.22888673;
v3d=-0.26834060;
t=0.1;
h=t*N;
zi=[(-t*(N/2)):t:(t*(N/2))];
za=2*t;
zd=zeros(1,N/4);
for i=1:2:((N/2)-1)
zd(i)=4*((zi(i+2)^3)-(zi(i)^3));
end
zd(N/4)=((zi((N/2)+3)^3)-(zi((N/2)-1)^3));
syms y1 y2 y3 y4
eq1=((v1a*h)-(za*((2*cos(2*y1))+(2*cos(2*y2))+(2*cos(2*y3))+(2*cos(2*y4))))==0); %v1a
eq2=((v3a*h)-(za*((2*cos(4*y1))+(2*cos(4*y2))+(2*cos(4*y3))+(2*cos(4*y4))))==0); %v3a
eq3=(((v1d*h^3)/4)-(zd(1)*(cos(2*y1)))-(zd(2)*(cos(2*y2)))-(zd(3)*(cos(2*y3)))-(zd(4)*(cos(2*y4)))==0); %v1d
eq4=(((v3d*h^3)/4)-(zd(1)*(cos(4*y1)))-(zd(2)*(cos(4*y2)))-(zd(3)*(cos(4*y3)))-(zd(4)*cos(4*y4)))==0); %v3d
result = solve([eq1, eq2, eq3, eq4], [y1, y2, y3, y4]);
y1res = result.y1
y2res = result.y2
y3res = result.y3
y4res = result.y4
The error :
Attempt to execute SCRIPT solve as a function:
Error in solve (line 96)
result = solve([eq1, eq2, eq3, eq4], [y1, y2, y3, y4]);
0 个评论
回答(3 个)
John D'Errico
2016-3-3
It is generally a BAD idea to name your script solve. Then when you try to use the function solve, do you think that MATLAB will be confused?
Try this:
which solve -all
Don't use names that cause conflicts.
2 个评论
John D'Errico
2016-3-3
编辑:John D'Errico
2016-3-3
But that is not a "problem" but a fact. You have an over-determined system, worse, a nonlinear one. Apparently there are no solutions. This is to be entirely expected. Think of it like this - there simply is not sufficient flexibility among those 4 variables to enable you to solve all 8 equations exactly.
Walter Roberson
2016-3-3
Your initialization of zd is incorrect. You create it as a vector of zeros length N/4 (i.e., length 4) but you populate every second element of it up to N/2 - 1 (i.e., length 7), and then you store at N/4 (i.e., 4). So element 1, 3, 4, 5, and 7 are populated and element 2 and 6 are left 0.
I speculate that you wanted
for i = 1 : ((N/4)-1)
zd(i) = 4*((zi(2*i+2)^3)-(zi(2*i)^3));
end
4 个评论
Walter Roberson
2016-3-4
The code I speculated should accomplish the same thing but more compactly.
By the way, my tests show that your system is fairly stable if you have errors in your v1a and so on (you are not going to try to tell us that v1a = 15928512/100000000 exactly are you?)
There are 4 real-valued solutions to your equations for your variables y1, y3, and y4, but only 2 real-valued solutions for your variable y2.
(Oddly, if you make your v3d more negative, you can get into a zone where there are three real-valued solutions even though you are dealing with a quartic. The roots of the quartic all come out real-valued in that range, but one of the four roots triggers arcsin() of a value > 1 so that one root of the quartic leads to a complex-valued solution to the overall problem. This is, I know, a meaningless point, but it threw me for a while as I was trying to solve the problem under the assumption that your v1a, v3a, v1d, v3d were approximations instead of exact values.)
Aravind Sasikumar
2016-3-3
3 个评论
Walter Roberson
2016-3-4
You had extra equations being generated because your zd was larger than you thought.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Calculus 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!