matlab solve fsolve 三维图

matlab solve fsolve 三维图

引言

帮同学写了点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结束,01都取的到
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结束,01都取的到
for theta = 0:0.1:1
    % X存储结果,flag表示误差,exitflag为123时得到的结果是合理的
    % [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^*')

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值