电阻-温度数据拟合工具(最小二乘法)

代码(html)

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>电阻-温度数据拟合工具</title><script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script><style>body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;max-width: 1000px;margin: 0 auto;padding: 20px;background-color: #f5f7f9;color: #333;}h1 {color: #2c3e50;text-align: center;margin-bottom: 30px;}.container {display: flex;flex-wrap: wrap;gap: 20px;margin-bottom: 30px;}.data-section {flex: 1;min-width: 300px;background: white;border-radius: 8px;padding: 20px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);}.result-section {flex: 2;min-width: 300px;background: white;border-radius: 8px;padding: 20px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);}table {width: 100%;border-collapse: collapse;margin-bottom: 15px;}th, td {border: 1px solid #ddd;padding: 10px;text-align: center;}th {background-color: #f2f2f2;}th:first-child, th:nth-child(2) {width: 35%;}th:last-child {width: 30%;}#data-table td.action-cell {display: flex;justify-content: center;align-items: center;}input {width: 100%;box-sizing: border-box;padding: 8px;border: 1px solid #ddd;border-radius: 4px;}.btn {padding: 10px 15px;margin: 5px;border: none;border-radius: 4px;cursor: pointer;font-weight: bold;}.btn-primary {background-color: #3498db;color: white;}.btn-danger {background-color: #e74c3c;color: white;}.btn-success {background-color: #2ecc71;color: white;}.buttons {display: flex;justify-content: center;gap: 10px;margin-top: 10px;}.equation {font-size: 18px;margin: 15px 0;padding: 15px;background-color: #f9f9f9;border-left: 4px solid #3498db;border-radius: 4px;}.r-squared {font-size: 16px;margin: 15px 0;padding: 15px;background-color: #f9f9f9;border-left: 4px solid #2ecc71;border-radius: 4px;}.kb-values {font-size: 16px;margin: 10px 0;padding: 10px;background-color: #fff7f0;border-left: 4px solid #6c5ce7;border-radius: 4px;}.chart-container {margin-top: 20px;position: relative;height: 300px;width: 100%;}.instructions {background-color: #f8f9fa;padding: 15px;border-radius: 8px;margin-bottom: 20px;border-left: 4px solid #ffc107;}</style>
</head>
<body><h1>电阻-温度数据拟合工具</h1><div class="container"><div class="data-section"><h2>数据输入</h2><table id="data-table"><thead><tr><th>电阻值 (Ω)</th><th>温度值 (°C)</th><th>操作</th></tr></thead><tbody><tr><td><input type="number" class="resistance" step="0.1" value="100"></td><td><input type="number" class="temperature" step="0.1" value="20"></td><td class="action-cell"><button class="btn btn-danger" onclick="deleteRow(this)">删除</button></td></tr><tr><td><input type="number" class="resistance" step="0.1" value="120"></td><td><input type="number" class="temperature" step="0.1" value="25"></td><td class="action-cell"><button class="btn btn-danger" onclick="deleteRow(this)">删除</button></td></tr><tr><td><input type="number" class="resistance" step="0.1" value="140"></td><td><input type="number" class="temperature" step="0.1" value="30"></td><td class="action-cell"><button class="btn btn-danger" onclick="deleteRow(this)">删除</button></td></tr></tbody></table><div class="buttons"><button class="btn btn-primary" onclick="addRow()">添加行</button><button class="btn btn-success" onclick="calculateFit()">计算拟合</button></div></div><div class="result-section"><h2>拟合结果</h2><div class="equation" id="equation-result">拟合方程将显示在这里</div><div class="kb-values" id="kb-values">k = - , b = -</div><div class="r-squared" id="r-squared-result">决定系数将显示在这里</div><div class="chart-container" id="fit-chart"></div></div></div><script>// 全局变量存储图表实例
        let fitChart = null;// 添加新行function addRow() {const tbody = document.querySelector('#data-table tbody');const newRow = document.createElement('tr');newRow.innerHTML = `<td><input type="number" class="resistance" step="0.1" value="0"></td><td><input type="number" class="temperature" step="0.1" value="0"></td><td class="action-cell"><button class="btn btn-danger" onclick="deleteRow(this)">删除</button></td>`;tbody.appendChild(newRow);}// 删除行function deleteRow(button) {const tbody = document.querySelector('#data-table tbody');const row = button.parentNode.parentNode;if (tbody.rows.length > 1) { // 确保至少保留一行
                tbody.removeChild(row);} else {alert("至少需要保留一行数据");}}// 获取数据function getData() {const rows = document.querySelectorAll('#data-table tbody tr');const data = [];rows.forEach(row => {const resistance = parseFloat(row.querySelector('.resistance').value);const temperature = parseFloat(row.querySelector('.temperature').value);if (!isNaN(resistance) && !isNaN(temperature)) {data.push([resistance, temperature]);}});return data;}// 最小二乘法拟合function linearRegression(data) {let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;const n = data.length;data.forEach(point => {sumX += point[0];sumY += point[1];sumXY += point[0] * point[1];sumXX += point[0] * point[0];});const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);const intercept = (sumY - slope * sumX) / n;return { slope, intercept };}// 计算决定系数R²function calculateRSquared(data, slope, intercept) {// 计算y的平均值
            const yMean = data.reduce((sum, point) => sum + point[1], 0) / data.length;// 计算总平方和
            const totalSumOfSquares = data.reduce((sum, point) => {return sum + Math.pow(point[1] - yMean, 2);}, 0);// 计算残差平方和
            const residualSumOfSquares = data.reduce((sum, point) => {const predictedY = slope * point[0] + intercept;return sum + Math.pow(point[1] - predictedY, 2);}, 0);// 计算R²
            const rSquared = 1 - (residualSumOfSquares / totalSumOfSquares);return rSquared;}// 计算拟合function calculateFit() {const data = getData();if (data.length < 2) {alert("至少需要两个有效数据点才能进行拟合");return;}// 执行线性回归
            const { slope, intercept } = linearRegression(data);// 计算决定系数
            const rSquared = calculateRSquared(data, slope, intercept);// 显示结果:k、b单独一行
            document.getElementById('equation-result').textContent = `拟合方程: y = ${slope.toFixed(6)} x + ${intercept.toFixed(6)}`;document.getElementById('kb-values').textContent = `k = ${slope.toFixed(6)} , b = ${intercept.toFixed(6)}`;document.getElementById('r-squared-result').textContent = `决定系数 R² = ${rSquared.toFixed(6)}`;// 绘制图表
            drawChart(data, slope, intercept);}// 绘制图表function drawChart(data, slope, intercept) {const chartDom = document.getElementById('fit-chart');// 如果已有图表实例,先销毁if (fitChart) {fitChart.dispose();}// 创建新图表
            fitChart = echarts.init(chartDom);// 对x值进行排序,以便绘制平滑的拟合线
            const sortedData = [...data].sort((a, b) => a[0] - b[0]);const minX = Math.min(...sortedData.map(point => point[0]));const maxX = Math.max(...sortedData.map(point => point[0]));// 生成拟合线上的点
            const fitLine = [[minX, slope * minX + intercept],[maxX, slope * maxX + intercept]];// 计算用于自动设置坐标轴范围的值(包含数据点与拟合线)
            const allX = sortedData.map(p => p[0]).concat(fitLine.map(p => p[0]));const allY = sortedData.map(p => p[1]).concat(fitLine.map(p => p[1]));const rawMinX = Math.min(...allX);const rawMaxX = Math.max(...allX);const rawMinY = Math.min(...allY);const rawMaxY = Math.max(...allY);// 添加小的边距(当范围为0时提供默认边距)
            const xRange = rawMaxX - rawMinX;const yRange = rawMaxY - rawMinY;const xPad = xRange === 0 ? Math.abs(rawMinX) * 0.1 + 1 : xRange * 0.06;const yPad = yRange === 0 ? Math.abs(rawMinY) * 0.1 + 1 : yRange * 0.06;const xMin = rawMinX - xPad;const xMax = rawMaxX + xPad;const yMin = rawMinY - yPad;const yMax = rawMaxY + yPad;// 配置选项
            const option = {title: {text: '电阻-温度关系拟合',left: 'center'},tooltip: {trigger: 'axis',axisPointer: { type: 'cross' },formatter: function (params) {// params 是一个数组,里面包含两个 series 的数据(scatter 和 line)
                        const parts = params.map(p => {if (p.seriesType === 'scatter') {return `${p.marker} ${p.seriesName}: 电阻 ${p.data[0]} Ω, 温度 ${p.data[1]} °C`;} else if (p.seriesType === 'line') {return `${p.marker} ${p.seriesName}: 拟合值 ${p.data[1].toFixed(2)} °C`;} else {return '';}});return parts.join('<br/>');}},legend: {data: ['原始数据', '拟合直线'],top: 30},xAxis: {type: 'value',name: '电阻值 (Ω)',nameLocation: 'middle',nameGap: 30,min: xMin,max: xMax},yAxis: {type: 'value',name: '温度值 (°C)',nameLocation: 'middle',nameGap: 30,min: yMin,max: yMax},series: [{name: '原始数据',type: 'scatter',data: sortedData,symbolSize: 8},{name: '拟合直线',type: 'line',data: fitLine,lineStyle: {width: 2},symbol: 'none'}]};// 使用配置项和数据显示图表
            fitChart.setOption(option);}// 页面加载时初始化图表
        window.onload = function() {calculateFit();};// 窗口大小变化时调整图表大小
        window.addEventListener('resize', function() {if (fitChart) {fitChart.resize();}});</script>
</body>
</html>
View Code

ScreenGif

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

delphi clientdataset 中文过滤问题

为了不待midas.dll 引用了MidasLib 单元,这样中文过滤就得两个字才能过滤出来。比如 like %高% 是过滤不出来的,要like %高深% 经测试,去掉MidasLib ,则正常。带上dll

基于 systemd 的 Go 应用自动化部署完整指南

目录基于 systemd 的 Go 应用自动化部署完整指南部署流程总览详细部署流程1. 环境准备阶段1.1 前置条件检查1.2 系统用户创建1.3 目录结构建立2. 应用部署阶段2.1 文件复制与权限设置2.2 systemd 服务文件配置3. 服务配…

马来西亚股票数据API对接文档

马来西亚股票数据API对接文档本文档提供StockTV马来西亚股票市场(Bursa Malaysia)数据API的完整对接指南,包含实时行情、历史数据、公司信息等核心功能一、接口概览 1.1 支持交易所交易所代码 交易所名称 覆盖股票数量…

电子类网站建设wordpress文章名加后缀

在 Apache Flink 中&#xff0c;时间在流处理中是一个重要的概念&#xff0c;而时间语义则用于定义事件发生的时间。Flink 支持三种时间语义&#xff0c;分别是&#xff1a; Processing Time&#xff08;处理时间&#xff09;&#xff1a; 以机器的系统时间为基准&#xff0c;…

网站建设下单源码莱芜金点子信息港二手市场

参考 ​​​​​​【RabbitMQ】RabbitMQ架构模型_rabbitmq结构模型-CSDN博客 之前的学习都只是知道名字&#xff0c;但并没有真正的理解&#xff0c;每次看还是不懂&#xff0c;所以今日理解透 &#xff01; RabbitMQ 收发消息过程如下&#xff1a; 首先从消费者开始&#xff1…

深圳建企业网站公司云主机 asp 网站

1. 简述 SVM涉及的东西很多&#xff0c;如果要理解全面的话&#xff0c;要理解经验风险与置信风险&#xff0c;VC维理论&#xff0c;推导出最优化公式&#xff0c;最优化求解的拉格朗日解法&#xff0c;核函数&#xff0c;等等方面的内容&#xff0c;当前对SVM理解太少&#xf…

网站开发架构分类58同城推广电话

简介&#xff1a; 如何使用Spark On MaxCompute连接Phonix&#xff0c;将Hbase的数据写入到MaxCompute的对应表中&#xff0c;目前没有对应的案例&#xff0c;为了满足用户的需求。本文主要讲解使用Spark连接Phonix访问Hbase的数据再写入到MaxCompute方案实践。该方案的验证是使…

tuzicms做企业手机网站如何上海 房地产网站建设

一、消息队列消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合、异步消息、流量削锋等问题&#xff0c;实现高性能、高可用、可伸缩和最终一致性架构&#xff0c;是大型分布式系统不可缺少的中间件。目前在生产环境中使用较多的消息队列有ActiveMQ、Rabbit…

网站架构设计图怎么做wordpress网站如何播放视频

组合评价模型—模糊Borda(Matlab) 我们的征途是星辰大海&#xff0c;而并非烟尘人间。 目录 组合评价模型—模糊Borda(Matlab) 一、模糊Borda法简介 二、模糊Borda法主要步骤 &#xff08;1&#xff09;计算隶属度 &#xff08;2&#xff09;计算模糊频数 &#xff08;…

门源县住房和城乡建设局网站wordpress+悬浮+登录

目录 欧拉函数一、用公式求代码 二、线性筛法求欧拉函数扩展欧拉定理 欧拉函数 AcWing 873. 欧拉函数 一、用公式求 定义&#xff1a;1 ~ N 中与 N 互质的数的个数被称为欧拉函数&#xff0c;记为ϕ(N)。 怎么求呢&#xff1f;&#xff1f; 有一个公式&#xff1a; N p1a1 X…

中国铁道工程建设协会查证网站微信crm管理系统免费

zookeeper 集群 1、zookeeper 集群说明 initLimit 是Zookeeper用它来限定集群中的Zookeeper服务器连接到Leader的时限 syncLimit 限制了follower服务器与leader服务器之间请求和应答之间的时限 服务器名称与地址&#xff1a;集群信息&#xff08;服务器编号&#xff0c;服务器…

[OpenGL]相机环境

[OpenGL]相机环境pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Cou…

指令流水线的影响因素

机器周期的设置 为了方便流水线设计,每个阶段耗时都设置成一样的,以最长耗时为准 影响流水线的因素 结构相关(资源冲突) 多条指令在同一个时间争夺使用同一个资源而形成的冲突称为结构相关 例子在书本第257页第一张…

HT-SC4PS-33+:小功分大胃口,300 MHz-3 GHz全场通吃

HT-SC4PS-33+:小功分大胃口,300 MHz-3 GHz全场通吃HT-SC4PS-33+ 是成都恒利泰推出的 300-3000 MHz 超宽带一分四贴片功分器,插损低到 1.6 dB,隔离度 17 dB,幅度不平衡仅 0.4 dB,-40 ℃~+85 ℃全温漂得住;5G 小基…

网站开发新乡网站建设服务

os模块 在Python中文件和文件夹的操作要借助os模块里面的相关功能&#xff0c;具体步骤如下&#xff1a; 第一步&#xff1a;导入os模块 import os 第二步&#xff1a;调用os模块中的相关方法 os.函数名() 与文件操作相关方法 编号函数功能1os.rename(目标文件名称&…

济南建设厅网站安全员威海建设局网站楼盘信息公布

文章目录 1. 概述2. 内连接3. 外连接4. 自连接5. 联合查询-union,union all6. 子查询 1. 概述 在项目开发中&#xff0c;在进行数据库表结构设计是&#xff0c;会根据业务需求和业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所…

东莞市建设安监局网站首页网站运行维护

1.摘要 在细粒度图像识别(FGIR)中&#xff0c;区域注意力的定位和放大是一个重要因素&#xff0c;基于卷积神经网络(cnn)的方法对此进行了大量探索。近年来发展起来的视觉变压器(ViT)在计算机视觉任务中取得了可喜的成果。与cnn相比&#xff0c;图像序列化是一种全新的方式。然…

win7网站后台无法编辑青原区城乡建设局门户网站

接入CDN对免备案网站服务器来说有以下几个好处&#xff1a; 提高网站的访问速度&#xff1a;CDN会将网站的静态资源&#xff08;如图片、文档等&#xff09;缓存到离用户最近的节点服务器上&#xff0c;用户访问时可以从离他们最近的节点服务器获取资源&#xff0c;加快访问速度…

个人网站带论坛 备案百度发布信息的免费平台

摘要&#xff1a;在本博客中介绍了基于YOLOv8/v7/v6/v5的机场航拍小目标检测系统。该系统的核心技术是采用YOLOv8&#xff0c;并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;从而进行性能指标的综合对比。我们详细介绍了国内外在机场航拍小目标检测领域的研究现状、数据集处理…

高端网站的制作做标签这个网站刷单安全吗

UI Automator为Android程序的UI开发提供了测试环境,这里我们就来看一下Android App开发的自动化测试框架UI Automator使用教程,需要的朋友可以参考下 Android的自动化测试有很多框架&#xff0c;其中ui automator是google官方提供的黑盒UI相关的自动化测试工具&#xff0c;&am…