matlab:涉及复杂函数图像的交点求解

news/2024/6/17 15:23:14 标签: matlab, 开发语言

matlab_0">matlab:涉及复杂函数图像的交点求解

在MATLAB中求解两个图像的交点是一个常见的需求。本文将通过一个示例,展示如何求解两个图像的交点,并提供相应的MATLAB代码。

画出图像

首先,我们需要绘制两个图像,以便直观地看到它们的交点。以下是绘制图像的MATLAB代码:

matlab">% 定义符号变量
syms x1 x2;

% 上边界方程
eq1 = 10 + 110 * (0.8 + 0.05 + 0.4 * sin(4 * atan2(x2, x1))^16)^2 - (x1 + x2) == 0;

% 绘制图形
figure;

% 使用 fimplicit 绘制上边界
fimplicit(@(x1, x2) 10 + 110 * (b + 0.05 + 0.4 * sin(4 * atan2(x2, x1))^16)^2 - (x1 + x2), [0, 100, 0, 100]);
hold on;

% 使用 fimplicit 绘制 y = 100 - x1
fimplicit(@(x1, x2) x1 + x2 - 100, [0, 100, 0, 100]);

% 设置图例和标题
legend('Upper Boundary', 'y = 100 - x1');
title('Plot of Equations');
xlabel('x1');
ylabel('x2');
hold off;

绘制的图像如下所示:
在这里插入图片描述
从图中可以看出,存在四个实数域交点。

求解交点方法1:solve不加求解范围(失败)

首先尝试使用solve函数来求解交点:

matlab">% 定义符号变量
syms x1 x2;

% 定义参数
b = 0.8;
l = atan2(x2, x1);

% 定义方程组
eq1 = 10 + 110 * (b + 0.05 + 0.4 * sin(4 * l)^16)^2 - (x1 + x2);
eq2 = x1 + x2 - 100;

% 解方程组
[sol_x1, sol_x2] = solve([eq1 == 0, eq2 == 0], [x1, x2]);

% 转换为数值解
sol_x1 = double(sol_x1);
sol_x2 = double(sol_x2);

% 筛选实数解
real_solutions = [sol_x1, sol_x2];
real_solutions = real_solutions(imag(real_solutions(:, 1)) == 0 & imag(real_solutions(:, 2)) == 0, :);

% 输出实数解
disp('Real solutions (x1, x2):');
disp(real_solutions);

输出为空值,这表明在解的过程中遇到了问题。

求解交点方法2:solve加求解范围(成功)

matlab">% 定义符号变量
syms x1 x2;

% 求解范围
assume(x1>=0&x1<=100)
assume(x2>=0&x2<=100)

% 定义参数
b = 0.8;
l = atan2(x2, x1);

% 定义方程组
eq1 = 10 + 110 * (b + 0.05 + 0.4 * sin(4 * l)^16)^2 - (x1 + x2);
eq2 = x1 + x2 - 100;

% 解方程组
[sol_x1, sol_x2] = solve([eq1 == 0, eq2 == 0], [x1, x2]);

% 转换为数值解
sol_x1 = double(sol_x1);
sol_x2 = double(sol_x2);

% 筛选实数解
real_solutions = [sol_x1, sol_x2];
real_solutions = real_solutions(imag(real_solutions(:, 1)) == 0 & imag(real_solutions(:, 2)) == 0, :);

% 输出实数解
disp('Real solutions (x1, x2):');
disp(real_solutions);

输出:
在这里插入图片描述

求解交点方法3:fsolve(成功)

下面通过数值方法而不是符号方法来找到解,使用 fsolve(数值求解函数):

matlab">% 定义匿名函数
func = @(x) [10 + 110 * (b + 0.05 + 0.4 * sin(4 * atan2(x(2), x(1)))^16)^2 - (x(1) + x(2)), x(1) + x(2) - 100];

% 设置选项以使用较大的初始搜索范围
options = optimoptions('fsolve', 'Display', 'off', 'MaxFunctionEvaluations', 6000, 'MaxIterations', 4000);

% 存储解
solutions = [];

% 尝试多个随机初始猜测
for i = 1:100
    initial_guess = rand(1, 2) * 100; % 生成0到100之间的随机初始猜测
    [sol, fval, exitflag, output] = fsolve(func, initial_guess, options);
    % 只有当fsolve成功收敛时才记录解
    if exitflag > 0 && all(abs(fval) < 1e-6)
        solutions = [solutions; sol];
    end
end

% 去除重复的解,考虑数值误差
solutions = round(solutions, 3); % 四舍五入到三位小数
solutions = unique(solutions, 'rows', 'stable');

% 过滤掉不在感兴趣区域的解
solutions = solutions(all(solutions >= 0 & solutions <= 100, 2), :);

% 输出数值解
disp('Numerical solutions (x1, x2):');
disp(solutions);

输出:
在这里插入图片描述
这表明成功找到了交点的坐标,不过误差稍大一些。

总结

  • 使用solve时,限制求解范围是重要的
  • 当solve无能为力的时候,可以试试fsolve

http://www.niftyadmin.cn/n/5399942.html

相关文章

最新基于SWAT-MODFLOW地表水与地下水耦合技术应用

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

C++/C百元买百鸡问题现在有100元要买100只鸡,一只公鸡5元,一只母鸡3元,三只小鸡一元,问今如何买?

具体代码如下 #include<stdio.h>int main() {int i, j, k;for (i 0; i < 20; i)for (j 0; j < 33; j) {k 100 - i - j;if (k % 3 0 && i * 5 j * 3 k / 3 100)printf("公鸡&#xff1a;%d&#xff0c;母鸡&#xff1a;%d&#xff0c;小鸡&…

spring: HandlerInterceptor

文章目录 一、什么是HandlerInterceptor二、应用示例 一、什么是HandlerInterceptor HandlerInterceptor 是 Spring 框架中的一个接口&#xff0c;用于拦截处理程序执行。在 Spring MVC 中&#xff0c;你可以使用 HandlerInterceptor 来在处理程序执行前、执行后或渲染视图之前…

Python爬虫——Urllib库-3

目录 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 获取豆瓣电影前十页的数据 ajax的post请求 总结 ajax的get请求 获取豆瓣电影第一页的数据并保存到本地 首先可以在浏览器找到发送数据的接口 那么我们的url就可以在header中找到了 再加上UA这个header 进行请…

WordPress分类目录ID怎么看?如何查找WordPress标签ID?

在WordPress网站中&#xff0c;我们需要判断某篇文章是否属于某个分类目录&#xff0c;或者是否拥有某个标签&#xff0c;那么就需要用到分类目录ID和标签ID&#xff0c;那么WordPress分类目录ID怎么看&#xff1f;如何查找WordPress标签ID&#xff1f;下面boke112百科就跟大家…

5 分钟配置好 Electron 应用的图标

最近在开发博客本地客户端 HexoPress&#xff0c;应用做好后&#xff0c;需要打包&#xff0c;如果不希望打包出来 App 的图标用的是 Electron 默认的星球环绕的图标&#xff0c;那么需要自己制作图标。 制作图标 首先&#xff0c;你需要给各种操作系统制作一个满足要求的图标…

Python进阶学习:Pandas--向DataFrame中指定位置添加一列或多列

Python进阶学习&#xff1a;Pandas–向DataFrame中指定位置添加一列或多列 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f44…

MySQL索引失效与MySQL8新添加的索引特性

目录 MySQL索引失效的场景 数据表和索引的准备 1 .联合索引不满足最左匹配原则 2.对索引进行表达式计算 3.对索引使用函数 4.对索引隐式类型转换 5.like的不当使用 6.where子句中的 or 7.not int导致索引部分失效 MySQL8新增的索引特性 函数索引 索引跳跃扫描(Index…