引言
帮同学写了点matlab代码,使用solve函数和fsolve函数对方程进行求解和画三维图,把代码记录如下。路过的朋友可以对代码稍作修改,完成自己需要的任务,代码里有问题的话,请评论区告知,谢谢!
solve函数
使用矩阵res对结果进行了存储
% 设置res矩阵用来存储结果,100*3,每一行表示一组结果,第一列表示theta的值,第二列表示x的解,第三列表示y的解【注意,如果一个theta只有一组解的话,11行就够了,考虑一个theta可能有多个解,初始化了100行】
res = zeros(100, 3);
% r表示第几行,初始值设置为1
r = 1;
% 等号右边有三个参数,0表示从0开始,0.1表示步长为0.1,1.0表示到1结束,0和1都取的到
for theta = 0:0.1:1
% 两个未知数 x和y
syms x y;
% 第一个方程,x+2y-theta=0
eq1 = x + 2 * y - theta;
% 第二个方程,x^2 - y^2=0
eq2 = x^2 - y^2;
s = solve(eq1, eq2, x, y);
% 无解的情况
if length(s.x) == 0
fprintf('theta 等于 %8.2f 时无解\n',theta);
% 只有一组解的情况
elseif length(s.x) == 1
% 将theta的值保存在这一行的第一列中
res(r, 1) = theta;
% 将求解出的x保存在这一行的第二列中
res(r, 2) = s.x;
% 将求解出的y保存在这一行的第三列中
res(r, 3) = s.y;
r = r + 1;
% 具有多组解的情况
else
for index = 1:1:length(s.x)
% 将theta的值保存在这一行的第一列中
res(r, 1) = theta;
% 将求解出的x保存在这一行的第二列中
res(r, 2) = s.x(index);
% 将求解出的y保存在这一行的第三列中
res(r, 3) = s.y(index);
r = r + 1;
end
end
end
% 把res矩阵里多余的行去掉
res = res(1:r-1,:);
fsolve函数
首先编写myfun1.m
function F = myfun1(X, theta)
% x是第一个变量
x = X(1);
% y是第二个变量
y = X(2);
% 第一个等式
F(1) = x - 0.6 * sin(x) - 0.3 * cos(y) - theta;
% 第二个等式
F(2) = y - 0.6 * cos(y) + 0.3 * sin(y) - theta;
使用矩阵res对结果进行了存储
% 设置res矩阵用来存储结果,100*3,每一行表示一组结果,第一列表示theta的值,第二列表示x的解,第三列表示y的解【注意,如果一个theta只有一组解的话,11行就够了,考虑一个theta可能有多个解,初始化了100行】
res = zeros(100, 3);
% r表示第几行,初始值设置为1
r = 1;
% 等号右边有三个参数,0表示从0开始,0.1表示步长为0.1,1.0表示到1结束,0和1都取的到
for theta = 0:0.1:1
% X存储结果,flag表示误差,exitflag为1、2和3时得到的结果是合理的
% [0.5 0.6]是设置的初始值,0.5是x的初始值,0.6是y的初始值
[X,fval,exitflag] = fsolve(@(X) myfun1(X, theta), [0.5, 0.6], optimset('Display', 'off'))
% 无解的情况
if length(X) == 0
fprintf('theta 等于 %8.2f 时无解\n',theta);
% 只有一组解的情况
elseif length(X) == 2
% 将theta的值保存在这一行的第一列中
res(r, 1) = theta;
% 将求解出的x保存在这一行的第二列中
res(r, 2) = X(1);
% 将求解出的y保存在这一行的第三列中
res(r, 3) = X(2);
r = r + 1;
% 具有多组解的情况
else
for index = 1:1:length(X) / 2
% 将theta的值保存在这一行的第一列中
res(r, 1) = theta;
% 将求解出的x保存在这一行的第二列中
res(r, 2) = X(index, 1);
% 将求解出的y保存在这一行的第三列中
res(r, 3) = X(index, 2);
r = r + 1;
end
end
end
% 把res矩阵里多余的行去掉
res = res(1:r-1,:);
画三维图
% 0:2:10表示x【即p2】从0每间隔2取到10
% 0:0.1:1表示y【即y2】从0每间隔0.1取到1
[x,y] = meshgrid(0:2:10, 0:0.1:1);
z = (6 + (x + (1 - x) .* y) .* 8) / 3;
% surf(x,y,z)可替换为mesh(x,y,z) meshc(x,y,z) meshz(x,y,z) surf(x,y,z) surfc(x,y,z) surfl(x,y,z) 会有不同的图形效果
surf(x,y,z),xlabel('p_2'),ylabel('Y_2'),zlabel('e_2^*')