(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之间,通过缩放和平移,可以将值控制到任意闭合区间。

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

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


相关文章
|
7月前
|
机器学习/深度学习 算法 PyTorch
【文末送书】Python深度学习(基于PyTorch)
【文末送书】Python深度学习(基于PyTorch)
44 0
|
4月前
|
机器学习/深度学习 PyTorch TensorFlow
|
1天前
|
机器学习/深度学习 PyTorch 算法框架/工具
【Python机器学习专栏】PyTorch在深度学习中的应用
【4月更文挑战第30天】PyTorch是流行的开源深度学习框架,基于动态计算图,易于使用且灵活。它支持张量操作、自动求导、优化器和神经网络模块,适合快速实验和模型训练。PyTorch的优势在于易用性、灵活性、社区支持和高性能(利用GPU加速)。通过Python示例展示了如何构建和训练神经网络。作为一个强大且不断发展的工具,PyTorch适用于各种深度学习任务。
|
12天前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow与PyTorch在Python面试中的对比与应用
【4月更文挑战第16天】这篇博客探讨了Python面试中TensorFlow和PyTorch的常见问题,包括框架基础操作、自动求梯度与反向传播、数据加载与预处理。易错点包括混淆框架API、动态图与静态图的理解、GPU加速的利用、模型保存恢复以及版本兼容性。通过掌握这些问题和解决策略,面试者能展示其深度学习框架技能。
34 9
|
15天前
|
机器学习/深度学习 PyTorch 算法框架/工具
Python中用PyTorch机器学习神经网络分类预测银行客户流失模型
Python中用PyTorch机器学习神经网络分类预测银行客户流失模型
23 0
|
16天前
|
机器学习/深度学习 算法 PyTorch
在Python中使用LSTM和PyTorch进行时间序列预测
在Python中使用LSTM和PyTorch进行时间序列预测
26 0
|
6月前
|
缓存 并行计算 PyTorch
win11+pytorch1.7.0+python3.8(也可以是python3.7)+cuda11.0
win11+pytorch1.7.0+python3.8(也可以是python3.7)+cuda11.0
137 0
|
2月前
|
安全 数据挖掘 数据处理
python数据分析——数据分析如何合法的进行
数据分析如何合法的进行,这是一个在当今数字化时代愈发重要的问题。随着大数据技术的快速发展,数据分析已经渗透到各个领域,从商业决策到政策制定,从医疗健康到个人生活,无处不在。然而,数据的获取、存储、处理和使用都必须遵循法律法规,尊重个人隐私,保护数据安全。
39 1
|
3月前
|
机器学习/深度学习 人工智能 PyTorch
Python 与人工智能的完美结合——解析 PyTorch 框架
【2月更文挑战第4天】本文将探讨 Python 在人工智能领域中的应用,以及介绍 PyTorch 框架。PyTorch 是一个基于 Python 的开源机器学习库,其强大的自动微分功能和易于使用的接口使其成为深度学习领域的热门选择。本文将从 PyTorch 的发展历程、工作原理以及示例代码等方面进行详细分析和解释。
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
Python中的深度学习:TensorFlow与PyTorch的选择与使用
Python中的深度学习:TensorFlow与PyTorch的选择与使用