(python)利用pytorch拟合法求解非线性方程组

简介: (python)利用pytorch拟合法求解非线性方程组

一、问题

比如要求解非线性方程组

(1)sini+sinθ=1.2

(2)θ−i=33  

如果直接去求解会非常困难,但是可以尝试使用拟合的方式

pytorch虽然是深度学习常用库,但是对于求解非线性的拟合问题还是非常可靠的。

二、求解

步骤1:确定变量

首先分析方程,有两个未知数,分别是θi,并且它们都是角度制

于是将它们写在一个字典中,用于存放 角度变量

'''
角度变量
'''
cfg_rad = {
    "i":30,
    "theta":40,
}

另外一般变量,或者弧度制的可以放到一般变量中比如没有出现角度的情况

但是此例子没有用到一般变量

'''
一般变量
'''
cfg_constant = {
}

步骤2:设置模型

这一步不用多看,其实就是将cfg中的变量,加载到模型中,也不需要修改,使用的时候直接复制就行了

class model(nn.Module):
    def __init__(self):
        super(model, self).__init__()
        for key,value in cfg_rad.items():
            setattr(self,key,nn.Parameter(torch.tensor(value)/180*np.pi))
        for key,value in cfg_constant.items():
            setattr(self,key,nn.Parameter(torch.tensor(value)))
    def rt_cfg(self):
        return *cfg_rad.keys(), *cfg_constant.keys()
    def forward(self):
        return [getattr(self,tmp) for tmp in self.rt_cfg()]

步骤3:初始化变量

只需要在定义变量最佳值加入 best_i、best_theta就行

net = model()
    optimizer = torch.optim.SGD(net.parameters(), lr=0.001)
    epoch = 1000
    best_loss = 10 ** 5
    '''
    变量最佳值
    '''
    best_i = None
    best_theta = None

步骤4:设置目标函数

这里就是输入我们的目标方程

对于sini+sinθ=1.2,我们可以写成(sini+sinθ1.2)2

对于θi=33°,写成θi33/180π -----------------------因为传入模型的时候对角度变量手动转换成弧度制了

loss = (torch.sin(i) + torch.sin(theta) - 1.2) ** 2 + (theta - i - torch.tensor(33 / 180 * np.pi)) ** 2

步骤5:常规训练过程

注意当损失比较大难以收敛的时候,可以调整学习率参数lr

optimizer = torch.optim.SGD(net.parameters(), lr=0.001)

步骤6:查看结果

可以看到误差达到了小数点后4位

以及求解的iθ

三、完整的代码

只需要修改加注释的部分即可

import torch
import numpy as np
from torch import nn
'''
角度变量
'''
cfg_rad = {
    "i":30,
    "theta":40,
}
'''
一般变量
'''
cfg_constant = {
}
class model(nn.Module):
    def __init__(self):
        super(model, self).__init__()
        for key,value in cfg_rad.items():
            setattr(self,key,nn.Parameter(torch.tensor(value)/180*np.pi))
        for key,value in cfg_constant.items():
            setattr(self,key,nn.Parameter(torch.tensor(value)))
    def rt_cfg(self):
        return *cfg_rad.keys(), *cfg_constant.keys()
    def forward(self):
        return [getattr(self,tmp) for tmp in self.rt_cfg()]
def train():
    net = model()
    optimizer = torch.optim.SGD(net.parameters(), lr=0.001)
    epoch = 1000
    best_loss = 10 ** 5
    '''
    变量最佳值
    '''
    best_i = None
    best_theta = None
    for _ in range(epoch):
        '''
        变量值 
        '''
        i, theta = net()
        # theta = i+torch.tensor(33/180*np.pi)
        '''
        目标方程
        '''
        loss = (torch.sin(i) + torch.sin(theta) - 1.2) ** 2 + (theta - i - torch.tensor(33 / 180 * np.pi)) ** 2
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if loss < best_loss:
            '''
            修改
            '''
            best_loss = loss
            best_i = i
            best_theta = theta
        print(loss)
    '''
    输出变量值
    '''
    print("i:", best_i / np.pi * 180)
    print("theta:", best_theta / np.pi * 180)
if __name__ == '__main__':
    train()

四、(补充)求解规划问题

比如要添加θ0这一个条件时候,如何添加限制呢?

模型中的参数默认是+之间的,因此可以通过换元法解决。

要设置θ0 可以设置变量theta_mega, 其中theta_mega区间是无穷的

另theta=theta_mega**2

这样子得到的theta就是大于等于0了

让模型去学习参数theta_mega,但实际上使用变量theta就行了。

或者可以套用相关激活函数,如sigmoid,将值限制在-1~1之间,通过缩放和平移,可以将值控制到任意闭合区间。

另外除了现有的激活函数,还可以手动设计函数,控制变量的范围。

最终可以达到全局最优解。


相关文章
|
1月前
|
PyTorch Linux 算法框架/工具
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
这篇文章是关于如何使用Anaconda进行Python环境管理,包括下载、安装、配置环境变量、创建多版本Python环境、安装PyTorch以及使用Jupyter Notebook的详细指南。
249 1
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
|
2月前
|
数据挖掘 PyTorch TensorFlow
|
1月前
|
机器学习/深度学习 缓存 PyTorch
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
这篇文章是关于如何下载、安装和配置Miniconda,以及如何使用Miniconda创建和管理Python环境的详细指南。
349 0
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
62 0
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
65 0
|
4月前
|
数据挖掘 PyTorch TensorFlow
Python数据分析新纪元:TensorFlow与PyTorch双剑合璧,深度挖掘数据价值
【7月更文挑战第30天】随着大数据时代的发展,数据分析变得至关重要,深度学习作为其前沿技术,正推动数据分析进入新阶段。本文介绍如何结合使用TensorFlow和PyTorch两大深度学习框架,最大化数据价值。
102 8
|
4月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
【7月更文挑战第31天】在数据驱动时代,Python凭借其简洁性与强大的库支持,成为数据分析与机器学习的首选语言。**数据分析基础**从Pandas和NumPy开始,Pandas简化了数据处理和清洗,NumPy支持高效的数学运算。例如,加载并清洗CSV数据、计算总销售额等。
60 2
|
4月前
|
机器学习/深度学习 数据挖掘 TensorFlow
|
4月前
|
机器学习/深度学习 PyTorch TensorFlow
在深度学习中,数据增强是一种常用的技术,用于通过增加训练数据的多样性来提高模型的泛化能力。`albumentations`是一个强大的Python库,用于图像增强,支持多种图像变换操作,并且可以与深度学习框架(如PyTorch、TensorFlow等)无缝集成。
在深度学习中,数据增强是一种常用的技术,用于通过增加训练数据的多样性来提高模型的泛化能力。`albumentations`是一个强大的Python库,用于图像增强,支持多种图像变换操作,并且可以与深度学习框架(如PyTorch、TensorFlow等)无缝集成。
|
6月前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow与PyTorch在Python面试中的对比与应用
【4月更文挑战第16天】这篇博客探讨了Python面试中TensorFlow和PyTorch的常见问题,包括框架基础操作、自动求梯度与反向传播、数据加载与预处理。易错点包括混淆框架API、动态图与静态图的理解、GPU加速的利用、模型保存恢复以及版本兼容性。通过掌握这些问题和解决策略,面试者能展示其深度学习框架技能。
221 9