无法解决matlab中的方程式(已知解决方案)

时间:2017-05-24 01:09:36

标签: matlab

我正在尝试在matlab中用3个变量求解一个包含3个方程的系统。

这是matlab代码:

clear;
close all;
clc;

syms x y z
eq1 = 30 - ((30*sin(y) + (6032463447834141*(30*cos(y)*sin(x) - (30*sin(y)*((139651314883359*cos(y)*sin(x))/140737488355328 + (10*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/15869 + (12*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/15869))/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869)))/(72057594037927936*(((842441452475839123526592959619*cos(y)*sin(x))/10141204801825835211973625643008 + (30162317239170705*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/571740979893939208192 + (18097390343502423*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/285870489946969604096)/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869) + 3888617886914517/36028797018963968)))*((12*15869^(1/2)*(cos(z)*sin(x) + cos(x)*sin(y)*sin(z)))/15869 - (139651314883359*cos(x)*cos(y))/140737488355328 + (10*15869^(1/2)*(sin(x)*sin(z) - cos(x)*cos(z)*sin(y)))/15869))/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869) - 30*cos(x)*cos(y) == -(8922777075240197*(30*cos(y)*sin(x) - (30*sin(y)*((139651314883359*cos(y)*sin(x))/140737488355328 + (10*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/15869 + (12*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/15869))/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869)))/(9007199254740992*(((842441452475839123526592959619*cos(y)*sin(x))/10141204801825835211973625643008 + (30162317239170705*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/571740979893939208192 + (18097390343502423*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/285870489946969604096)/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869) + 3888617886914517/36028797018963968));
eq2 = ((30*sin(y) - (2751313666748167*(30*cos(y)*sin(x) + (30*sin(y)*((10*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/15869 - (139651314883359*cos(y)*sin(x))/140737488355328 + (12*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/15869))/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869)))/(36028797018963968*(((13756568333740835*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/285870489946969604096 - (384224571217937317986432052953*cos(y)*sin(x))/5070602400912917605986812821504 + (8253941000244501*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/142935244973484802048)/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869) - 1085710309166423/18014398509481984)))*((139651314883359*cos(x)*cos(y))/140737488355328 + (12*15869^(1/2)*(cos(z)*sin(x) + cos(x)*sin(y)*sin(z)))/15869 + (10*15869^(1/2)*(sin(x)*sin(z) - cos(x)*cos(z)*sin(y)))/15869))/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869) - 30*cos(x)*cos(y) + 30 == -(8964476491404667*(30*cos(y)*sin(x) + (30*sin(y)*((10*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/15869 - (139651314883359*cos(y)*sin(x))/140737488355328 + (12*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/15869))/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869)))/(9007199254740992*(((13756568333740835*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/285870489946969604096 - (384224571217937317986432052953*cos(y)*sin(x))/5070602400912917605986812821504 + (8253941000244501*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/142935244973484802048)/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869) - 1085710309166423/18014398509481984));
eq3 = 30 - ((30*sin(y) - (5869842550983837*(30*cos(y)*sin(x) + (30*sin(y)*((278913769878129*cos(y)*sin(x))/281474976710656 + (10*13469^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/13469 - (12*13469^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/13469))/((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469)))/(72057594037927936*((5869842550983837*((278913769878129*cos(y)*sin(x))/281474976710656 + (10*13469^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/13469 - (12*13469^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/13469))/(72057594037927936*((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469)) + 7567579956186207/72057594037927936)))*((278913769878129*cos(x)*cos(y))/281474976710656 + (12*13469^(1/2)*(cos(z)*sin(x) + cos(x)*sin(y)*sin(z)))/13469 - (10*13469^(1/2)*(sin(x)*sin(z) - cos(x)*cos(z)*sin(y)))/13469))/((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469) - 30*cos(x)*cos(y) == (8927287469964123*(30*cos(y)*sin(x) + (30*sin(y)*((278913769878129*cos(y)*sin(x))/281474976710656 + (10*13469^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/13469 - (12*13469^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/13469))/((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469)))/(9007199254740992*((5869842550983837*((278913769878129*cos(y)*sin(x))/281474976710656 + (10*13469^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/13469 - (12*13469^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/13469))/(72057594037927936*((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469)) + 7567579956186207/72057594037927936));

equation_3_angles(1) = eq1;
equation_3_angles(2) = eq2;
equation_3_angles(3) = eq3;

fprintf('Trying to solve the equations (the function never finish)\n');
[x_solution, y_solution, z_solution] = solve(equation_3_angles,[x, y, z]);

求解功能永远不会完成..所以我无法得到解决方案。

上面的等式有解决方案。 解决方案

  • (x,y,z)=(0,0,0)

  • (x,y,z)=(0.523598775598299, 0, 0)

但我需要以数学方式获得这些解决方案。

我该怎么做?

由于

1 个答案:

答案 0 :(得分:0)

我尝试用这个脚本用数字解决它们:

x0=[0.1 0.1 0.1]

sol=fsolve(@fun,x0)

function[obj]=fun(xx)

调用此功能

function[obj]=fun(xx)

x=xx(1);
y=xx(2);
z=xx(3);

eq1 = 30 - ((30*sin(y) + (6032463447834141*(30*cos(y)*sin(x) - (30*sin(y)*((139651314883359*cos(y)*sin(x))/140737488355328 + (10*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/15869 + (12*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/15869))/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869)))/(72057594037927936*(((842441452475839123526592959619*cos(y)*sin(x))/10141204801825835211973625643008 + (30162317239170705*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/571740979893939208192 + (18097390343502423*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/285870489946969604096)/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869) + 3888617886914517/36028797018963968)))*((12*15869^(1/2)*(cos(z)*sin(x) + cos(x)*sin(y)*sin(z)))/15869 - (139651314883359*cos(x)*cos(y))/140737488355328 + (10*15869^(1/2)*(sin(x)*sin(z) - cos(x)*cos(z)*sin(y)))/15869))/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869) - 30*cos(x)*cos(y) -( -(8922777075240197*(30*cos(y)*sin(x) - (30*sin(y)*((139651314883359*cos(y)*sin(x))/140737488355328 + (10*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/15869 + (12*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/15869))/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869)))/(9007199254740992*(((842441452475839123526592959619*cos(y)*sin(x))/10141204801825835211973625643008 + (30162317239170705*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/571740979893939208192 + (18097390343502423*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/285870489946969604096)/((139651314883359*sin(y))/140737488355328 - (10*15869^(1/2)*cos(y)*cos(z))/15869 + (12*15869^(1/2)*cos(y)*sin(z))/15869) + 3888617886914517/36028797018963968)));
eq2 = ((30*sin(y) - (2751313666748167*(30*cos(y)*sin(x) + (30*sin(y)*((10*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/15869 - (139651314883359*cos(y)*sin(x))/140737488355328 + (12*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/15869))/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869)))/(36028797018963968*(((13756568333740835*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/285870489946969604096 - (384224571217937317986432052953*cos(y)*sin(x))/5070602400912917605986812821504 + (8253941000244501*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/142935244973484802048)/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869) - 1085710309166423/18014398509481984)))*((139651314883359*cos(x)*cos(y))/140737488355328 + (12*15869^(1/2)*(cos(z)*sin(x) + cos(x)*sin(y)*sin(z)))/15869 + (10*15869^(1/2)*(sin(x)*sin(z) - cos(x)*cos(z)*sin(y)))/15869))/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869) - 30*cos(x)*cos(y) + 30 -( -(8964476491404667*(30*cos(y)*sin(x) + (30*sin(y)*((10*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/15869 - (139651314883359*cos(y)*sin(x))/140737488355328 + (12*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/15869))/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869)))/(9007199254740992*(((13756568333740835*15869^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/285870489946969604096 - (384224571217937317986432052953*cos(y)*sin(x))/5070602400912917605986812821504 + (8253941000244501*15869^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/142935244973484802048)/((139651314883359*sin(y))/140737488355328 + (10*15869^(1/2)*cos(y)*cos(z))/15869 - (12*15869^(1/2)*cos(y)*sin(z))/15869) - 1085710309166423/18014398509481984)));
eq3 = 30 - ((30*sin(y) - (5869842550983837*(30*cos(y)*sin(x) + (30*sin(y)*((278913769878129*cos(y)*sin(x))/281474976710656 + (10*13469^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/13469 - (12*13469^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/13469))/((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469)))/(72057594037927936*((5869842550983837*((278913769878129*cos(y)*sin(x))/281474976710656 + (10*13469^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/13469 - (12*13469^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/13469))/(72057594037927936*((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469)) + 7567579956186207/72057594037927936)))*((278913769878129*cos(x)*cos(y))/281474976710656 + (12*13469^(1/2)*(cos(z)*sin(x) + cos(x)*sin(y)*sin(z)))/13469 - (10*13469^(1/2)*(sin(x)*sin(z) - cos(x)*cos(z)*sin(y)))/13469))/((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469) - 30*cos(x)*cos(y) -( (8927287469964123*(30*cos(y)*sin(x) + (30*sin(y)*((278913769878129*cos(y)*sin(x))/281474976710656 + (10*13469^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/13469 - (12*13469^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/13469))/((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469)))/(9007199254740992*((5869842550983837*((278913769878129*cos(y)*sin(x))/281474976710656 + (10*13469^(1/2)*(cos(x)*sin(z) + cos(z)*sin(x)*sin(y)))/13469 - (12*13469^(1/2)*(cos(x)*cos(z) - sin(x)*sin(y)*sin(z)))/13469))/(72057594037927936*((10*13469^(1/2)*cos(y)*cos(z))/13469 - (278913769878129*sin(y))/281474976710656 + (12*13469^(1/2)*cos(y)*sin(z))/13469)) + 7567579956186207/72057594037927936)));

obj=[eq1;eq2;eq3]

end

这就是我所得到的,正如预期的那样

fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>

sol =
    0.5236    0.0000    0.0000

如果您使用x0=[0 0 0]作为种子,结果是(按预期):

sol =
     0     0     0

但是,解决方案极其依赖于初始猜测(种子)。例如,对于x0=[1 1 1],结果为:

sol =
   -2.2063    3.0245    3.1109

为了找到可能的解决方案,您可以修改脚本以执行这样的扫描:

n=5; %You can change this value for trying more points

x0=linspace(0,2*pi,n)
y0=linspace(0,2*pi,n)
z0=linspace(0,2*pi,n)

sol=zeros(n^3,3);
fval=zeros(n^3,3);
fval_flag=ones(n^3,1);

c=0;
for i=1:n
    for j=1:n
        for k=1:n
            c=c+1;
            [sol(c,:),fval(c,:)]=fsolve(@fun,[x0(i) y0(j) z0(k)]);
            %Check if the function evaluation is larger than 1e-6 because
            %this might not be a solution and set a flag
            if any(fval(c,:)>1e-6)
                fval_flag(c)=0;
            end
        end
    end
end

%Get only the solutions from 0 to 2*pi. This will list all the rows with
%this condition
[row,col]=find(sol<0 | sol>2*pi);
%Sort and get the unique rows with wrong values
row=unique(sort(row));
%Create a copy of the solution and remove this rows from the solution
sol2=sol;
sol2(row,:)=[];
fval_flag(row)=[];

%Show and compare the obtained solutions with its flag values (is the 4th
%column is 0 then it might not be a solution
out=[sol2 fval_flag]

这将删除范围[0 2*pi]之外的可能解决方案,并将显示x,y,a的解决方案以及显示0的标志,其值可能不是解,因为方程式不接近应该为0(我使用1e-6的公差变量。)